如何用生成器遍历文件系统?
我正在尝试创建一个工具类,用来遍历一个文件夹里的所有文件,包括子文件夹和更深层的子文件夹。我想用生成器来实现,因为生成器很酷;不过,我遇到了一些问题。
def grab_files(directory):
for name in os.listdir(directory):
full_path = os.path.join(directory, name)
if os.path.isdir(full_path):
yield grab_files(full_path)
elif os.path.isfile(full_path):
yield full_path
else:
print('Unidentified name %s. It could be a symbolic link' % full_path)
当生成器到达一个文件夹时,它只是返回了新生成器的内存地址,并没有给我这个文件夹里的内容。
我该如何让生成器返回文件夹里的内容,而不是一个新的生成器呢?
如果已经有简单的库函数可以递归地列出文件夹结构中的所有文件,请告诉我。我不打算重复一个库函数的功能。
7 个回答
15
我同意使用 os.walk 这个方法。
为了更严谨一点,建议你可以遍历生成器对象,而不是直接返回它:
def grab_files(directory):
for name in os.listdir(directory):
full_path = os.path.join(directory, name)
if os.path.isdir(full_path):
for entry in grab_files(full_path):
yield entry
elif os.path.isfile(full_path):
yield full_path
else:
print('Unidentified name %s. It could be a symbolic link' % full_path)
16
从Python 3.4开始,你可以使用内置的pathlib模块里的glob()
方法:
import pathlib
p = pathlib.Path('.')
list(p.glob('**/*')) # lists all files recursively
65
为什么要重新发明轮子呢?其实你可以直接使用 os.walk。
import os
for root, dirs, files in os.walk(path):
for name in files:
print os.path.join(root, name)
os.walk 是一个生成器,它可以通过从上到下或从下到上的方式,遍历一个文件夹及其子文件夹,逐个返回里面的文件名。