我如何迭代给定目录中的文件?
我需要遍历给定目录内的所有.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)