【问题标题】:Iterating through individual files in os.walk in Python in an idiomatic fashion以惯用的方式在 Python 中遍历 os.walk 中的单个文件
【发布时间】:2014-04-09 15:52:57
【问题描述】:

我从another stackoverflow question 获得的一些代码开始为目录树中的所有文件生成完整路径:

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)

我想添加记忆,在我看来,最简单的实现方法就是让 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

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

我当然可以写:

def recursive_file_list(mydir):
    return list(recursive_file_gen(mydir))

并记住它。但我想知道是否有更清洁的东西。

【问题讨论】:

    标签: python list generator list-comprehension os.walk


    【解决方案1】:

    怎么样?

    result = [os.path.join(root, file) for root, dir, files in os.walk(mydir) for file in files]
    

    【讨论】:

    • 是的,就是这样!我想我可能在某个时候尝试过[os.path.join(root, file) for file in files for root, dir, files in os.walk(mydir)](两个for 子句以相反的顺序),但它不起作用。错误的顺序被证明是危险的:在我运行了你的答案之后(所以有一些东西绑定到files),顺序错误的版本实际上会运行,但会给出垃圾输出。
    猜你喜欢
    • 1970-01-01
    • 2023-01-09
    • 2013-06-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多