以惯用的方式在Python中迭代os.walk中的各个文件

kuz*_*roo 4 python list-comprehension list generator os.walk

我从另一个stackoverflow问题中得到的一些代码开始,为目录树中的所有文件生成完整路径:

import os
def recursive_file_gen(mydir):
    for root, dirs, files in os.walk(mydir):
        for file in files:
            yield os.path.join(root, file)
Run Code Online (Sandbox Code Playgroud)

我想添加memoization,在我看来,最简单的实现方法就是让recursive_file_gen返回一个列表:

def recursive_file_list(mydir):
    result = []
    for root, dirs, files in os.walk(mydir):
        for file in files:
            result.append(os.path.join(root, file))
    return result
Run Code Online (Sandbox Code Playgroud)

这段代码很好,真的.当然不难发现发生了什么.但是使用连续append操作组合列表并不完全是Pythonic.我的猜测是使用Python语法有更好的方法,可能是通过列表理解,并且学习它会有所启发.

我当然可以写:

def recursive_file_list(mydir):
    return list(recursive_file_gen(mydir))
Run Code Online (Sandbox Code Playgroud)

并记住这一点.但我想知道是否有更清洁的东西.

jun*_*er- 6

怎么样?

result = [os.path.join(root, file) for root, dir, files in os.walk(mydir) for file in files]
Run Code Online (Sandbox Code Playgroud)