我如何迭代给定目录中的文件?

我需要遍历给定目录内的所有.asm文件,并对它们执行一些操作。

这怎么能以有效的方式完成呢?

原始答案:

 for filename in os.listdir(directory): if filename.endswith(".asm") or filename.endswith(".py"): # print(os.path.join(directory, filename)) continue else: continue 

以上答案的Python 3.6版本,使用os – 假设你有一个名为directory_in_str的variables的目录path作为str对象:

 directory = os.fsencode(directory_in_str) for file in os.listdir(directory): filename = os.fsdecode(file) if filename.endswith(".asm") or filename.endswith(".py"): # print(os.path.join(directory, filename)) continue else: continue 

或者recursion地使用pathlib

 from pathlib import Path pathlist = Path(directory_in_str).glob('**/*.asm') for path in pathlist: # because path is object not string path_in_str = str(path) # print(path_in_str) 

你可以尝试使用glob模块

 import glob for filename in glob.iglob('/foobar/*.asm'): print('/foobar/%s' % filename) 

这将迭代所有的后代文件,而不仅仅是目录的直接子目录:

 import os for subdir, dirs, files in os.walk(rootdir): for file in files: #print os.path.join(subdir, file) filepath = subdir + os.sep + file if filepath.endswith(".asm"): print (filepath) 

Python 3.4及更高版本在标准库中提供了pathlib 。 你可以这样做:

 from pathlib import Path asm_pths = [pth for pth in Path.cwd().iterdir() if pth.suffix == '.asm'] 

或者如果你不喜欢列表parsing:

 asm_paths = [] for pth in Path.cwd().iterdir(): if pth.suffix == '.asm': asm_pths.append(pth) 

Path对象可以很容易地转换为string。

我对这个实现并不满意,但是我想有一个自定义的构造函数来实现DirectoryIndex._make(next(os.walk(input_path)))这样你就可以传递你想要的文件列表。 编辑欢迎!

 import collections import os DirectoryIndex = collections.namedtuple('DirectoryIndex', ['root', 'dirs', 'files']) for file_name in DirectoryIndex(*next(os.walk('.'))).files: file_path = os.path.join(path, file_name)