如何用生成器遍历文件系统?

33 投票
7 回答
34810 浏览
提问于 2025-04-15 15:48

我正在尝试创建一个工具类,用来遍历一个文件夹里的所有文件,包括子文件夹和更深层的子文件夹。我想用生成器来实现,因为生成器很酷;不过,我遇到了一些问题。


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 是一个生成器,它可以通过从上到下或从下到上的方式,遍历一个文件夹及其子文件夹,逐个返回里面的文件名。

撰写回答