协慌网

登录 贡献 社区

如何遍历给定目录中的文件?

我需要遍历.asm文件,并对它们执行一些操作。

如何有效地做到这一点?

答案

原始答案:

import os

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的变量中将目录路径作为str对象:

import os

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

或递归地使用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)
  • 使用rglob rglob('*.asm')替换为glob('**/*.asm')
    • 这就像调用Path.glob()并在给定相对模式前面添加'**/'
from pathlib import Path

pathlist = Path(directory_in_str).rglob('*.asm')
for path in pathlist:
     # because path is object not string
     path_in_str = str(path)
     # print(path_in_str)

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

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)

您可以尝试使用glob模块:

import glob

for filepath in glob.iglob('my_dir/*.asm'):
    print(filepath)

从 Python 3.5 开始,您还可以搜索子目录:

glob.glob('**/*.txt', recursive=True) # => ['2.txt', 'sub/3.txt']

从文档中:

尽管结果以任意顺序返回,但 glob 模块会根据 Unix shell 使用的规则查找与指定模式匹配的所有路径名。没有波浪符号扩展,但是 * 、? 和用 [] 表示的字符范围将正确匹配。