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

以Python os.walk为例的递归定义,python,recursion,os.walk,Python,Recursion,Os.walk,我很难掌握如何使用python递归地列出目录中的文件。是否所有递归逻辑都发生在模块本身(os.walk)中 我已经找到了多种在目录中递归列出文件的方法,它们都遵循与上面相同的模式。这似乎是在对文件进行迭代。有人能给我解释一下这是如何递归完成的吗 os.walk()是一个生成器。它递归地列出所有目录,同时生成结果。请参见,但简化了,它归结为: def walk(top): try: names = os.listdir(top) except error, err:

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

我已经找到了多种在目录中递归列出文件的方法,它们都遵循与上面相同的模式。这似乎是在对文件进行迭代。有人能给我解释一下这是如何递归完成的吗

os.walk()
是一个生成器。它递归地列出所有目录,同时生成结果。请参见,但简化了,它归结为:

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)
为了简化这个过程,我省略了对错误回调、过滤符号链接和自底向上生成的支持

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