以Python os.walk为例的递归定义

时间:2014-05-31 15:09:13

标签: python recursion os.walk

我无法掌握如何使用python递归列出目录中的文件。所有的递归逻辑都发生在模块本身(os.walk)吗?

def listfiles(path):
    for root, dirs, files in os.walk(path):
        for f in files:
            print(f)

我已经查找了多种方法来递归列出目录中的文件,它们都遵循与上面相同的模式。这似乎是在遍历文件。有人可以向我解释这是如何递归完成的吗?

1 个答案:

答案 0 :(得分:3)

os.walk()是一个生成器。它在生成结果的同时递归地列出目录。请参阅source code,但已简化,可归结为:

def walk(top):
    try:
        names = os.listdir(top)
    except error, err:
        return

    dirs, nondirs = [], []
    for name in names:
        if os.path.isdir(os.path.join(top, name)):
            dirs.append(name)
        else:
            nondirs.append(name)

    yield top, dirs, nondirs

    for name in dirs:
        new_path = os.path.join(top, name)
        for x in walk(new_path):  # recursive call
            yield x

此代码列出收集目录和常规文件后的顶部路径,然后递归到嵌套目录。通过显式生成结果来传递递归调用。 Python 3版本在那里使用生成器委派:

for name in dirs:
    new_path = os.path.join(top, name)
    yield from walk(new_path)

为了简化这一点,我省略了对错误回调,过滤符号链接和自下而上生成的支持。