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

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

如何以有效的方式做到这一点?

1152380 次浏览

上述答案的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))continueelse:continue

或者递归地,使用pathlib

from pathlib import Path
pathlist = Path(directory_in_str).glob('**/*.asm')for path in pathlist:# because path is object not stringpath_in_str = str(path)# print(path_in_str)
  • 使用rglobglob('**/*.asm')替换为rglob('*.asm')
    • 这就像调用Path.glob()'**/'添加在给定的相对模式前面:
from pathlib import Path
pathlist = Path(directory_in_str).rglob('*.asm')for path in pathlist:# because path is object not stringpath_in_str = str(path)# print(path_in_str)

原答复:

import os
for filename in os.listdir("/path/to/dir/"):if filename.endswith(".asm") or filename.endswith(".py"):# print(os.path.join(directory, filename))continueelse:continue

您可以尝试使用球状模块:

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使用的规则查找与指定模式匹配的所有路径名,尽管结果以任意顺序返回。没有波浪展开,但用[]表示的 *, ?, 和字符范围将被正确匹配。

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

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']

或者如果你不喜欢列表理解:

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

Path对象可以很容易地转换为字符串。

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

import collectionsimport 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)

以下是我如何在Python中迭代文件:

import os
path = 'the/name/of/your/path'
folder = os.fsencode(path)
filenames = []
for file in os.listdir(folder):filename = os.fsdecode(file)if filename.endswith( ('.jpeg', '.png', '.gif') ): # whatever file types you're using...filenames.append(filename)
filenames.sort() # now you have the filenames and can do something with them

这些技术都不能保证任何重复排序

是的,超级不可预测。请注意,我对文件名进行了排序,如果文件的顺序很重要,即视频帧或时间相关的数据采集,这一点很重要。不过,请务必在文件名中添加索引!

从Python 3.5开始,使用os.scandir()和2-20倍的速度(来源)会容易得多:

with os.scandir(path) as it:for entry in it:if entry.name.endswith(".asm") and entry.is_file():print(entry.name, entry.path)

使用scandir()而不是listdir()可以显着增加还需要文件类型或文件属性的代码的性能信息,因为os. DirEntry对象在以下情况下公开此信息操作系统在扫描目录时提供它。所有os. DirEntry方法可以执行系统调用,但is_dir()和is_file()通常只需要系统调用符号链接;os.DirEntry.stat()总是需要在Unix上进行系统调用,但只需要一个在Windows上的符号链接。

我真的很喜欢使用os库中内置的scandir指令。这是一个工作示例:

import os
i = 0with os.scandir('/usr/local/bin') as root_dir:for path in root_dir:if path.is_file():i += 1print(f"Full path is: {path} and just the name is: {path.name}")print(f"{i} files scanned successfully.")

您可以使用球状来引用目录和列表:

import globimport os
#to get the current working directory namecwd = os.getcwd()#Load the images from images folder.for f in glob.glob('images\*.jpg'):dir_name = get_dir_name(f)image_file_name = dir_name + '.jpg'#To print the file name with path (path will be in string)print (image_file_name)

要获取数组中所有目录的列表,您可以使用os

os.listdir(directory)

通过执行此操作获取目录中的所有. asm文件。

import os
path = "path_to_file"file_type = '.asm'
for filename in os.listdir(path=path):if filename.endswith(file_type):print(filename)print(f"{path}/{filename}")# do something below  

我不明白为什么有些答案很复杂。这就是我在Python 2.7中的做法。将DIRECTORY_TO_LOOP替换为您要使用的目录。

import osDIRECTORY_TO_LOOP = '/var/www/files/'for root, dirs, files in os.walk(DIRECTORY_TO_LOOP, topdown=False):for name in files:print(os.path.join(root, name))