用Python对目录进行迭代
我需要遍历给定目录的子目录并search文件。 如果我得到一个文件,我必须打开它,改变内容,并用我自己的线代替它。
我试过这个:
import os rootdir ='C:/Users/sid/Desktop/test' for subdir, dirs, files in os.walk(rootdir): for file in files: f=open(file,'r') lines=f.readlines() f.close() f=open(file,'w') for line in lines: newline = "No you are not" f.write(newline) f.close()
但我得到一个错误。 我究竟做错了什么?
实际浏览目录时会按照您编码的方式进行操作。 如果用简单的print
语句replace内部循环的内容,则可以看到每个文件都被find:
import os rootdir = 'C:/Users/sid/Desktop/test' for subdir, dirs, files in os.walk(rootdir): for file in files: print os.path.join(subdir, file)
如果在运行上述步骤时仍然出现错误,请提供错误消息。
返回子目录中所有文件的另一种方式是使用Python 3.4中引入的pathlib
模块 ,它提供了一种面向对象的方法来处理文件系统path(Pathlib也可以通过PyPi上的pathlib2模块在 Python 2.7中获得 ):
from pathlib import Path rootdir = Path('C:/Users/sid/Desktop/test') # Return a list of regular files only, not directories file_list = [f for f in rootdir.glob('**/*') if f.is_file()] # For absolute paths instead of relative the current dir file_list = [f for f in rootdir.resolve().glob('**/*') if f.is_file()]
从Python 3.5开始, glob
模块也支持recursion文件查找:
import os from glob import iglob rootdir_glob = 'C:/Users/sid/Desktop/test/**/*' # Note the added asterisks # This will return absolute paths file_list = [f for f in iglob('**/*', recursive=True) if os.path.isfile(f)]
上述任一方法的file_list
都可以迭代,而不需要嵌套循环:
for f in file_list: print(f) # Replace with desired operations
or subdir, dirs, files in os.walk(rootdir): os.chdir(rootdir) >>>>>>>>>>>>>>>>>>>>>>>>>> Pls add this line and try. for file in files: print file f=open(file,'r') lines=f.readlines()