【问题标题】:What is the most elegant way of counting files in a folder in Python?在 Python 中计算文件夹中文件的最优雅的方法是什么?
【发布时间】:2021-01-10 18:20:20
【问题描述】:

我对 Python 很陌生,目前正在学习它。

正如标题所说:对文件夹中的文件进行计数的最优雅、简洁、高效和 python 式的方法是什么?

假设一个文件夹只包含文件而没有子文件夹。

通过(天真地)应用我学到的东西,我想出了这个:

from os import walk

num_files = -1

for (dir_path, dir_names, file_names) in walk(image_file_path):
    for fn in file_names:
        num_files += 1

它看起来并不那么优雅,我意识到 fn 在整个迭代过程中一直未被使用。另外,那个num_files = -1是离优雅最远的东西。

那么有什么更好的写法呢?

提前致谢。

【问题讨论】:

    标签: python file directory numbers


    【解决方案1】:

    你可以试试os.listdir

    import os
    len(os.listdir(image_file_path))
    

    【讨论】:

    • 谢谢!超级干净。
    • @Polcio,请注意,os.listdir() 返回带有文件名的列表,而不是文件的完整路径。
    【解决方案2】:

    我个人喜欢glob:

    from glob import glob
    num_files = len(glob(dir_name.rstrip('/') + '/*'))
    

    【讨论】:

    • 谢谢! glob 和 os 有什么区别?一个比另一个更现代吗?
    • @Polcio glob 实际上是用来搜索带有正则表达式的文件。使用*,我要求它列出所有文件。您可以自定义模式以仅获取您想要的文件。
    【解决方案3】:

    您可以通过获取特定路径内的所有文件和文件夹来做到这一点,例如os.listdir("./")。而不是像[i for i in os.listdir("./") if os.path.isfile(i)] 这样使用列表理解过滤所有文件。最后计算您列表中的对象。如果我们把它们放在一起,它看起来像这样len([i for i in os.listdir("./") if os.path.isfile(i)])

    【讨论】:

    • os.listdir() 只返回没有根目录的文件名,因此只有从包含文件的同一目录执行脚本时,您的代码才能工作。或者,您可以使用os.scandir()sum(map(os.path.isfile, os.scandir("./")))
    【解决方案4】:

    我想说以下是最 Pythonic 的现代答案:

    from pathlib import Path
    
    path = Path(image_file_path)
    num_files = sum(1 for x in path.iterdir() if x.is_file())
    

    【讨论】:

    • 这比len(os.listdir(image_file_path)) 更“Pythonic”吗?
    • @DeepSpace pathlib 是一种比os 更现代的方法。此外,如果违反了 OP 的假设,即不存在子文件夹,则会给出错误的答案。
    • @orlp,为什么不sum(x.is_file() for x in path.iterdir())
    • @OlvinR​​oght 那行得通,而且在不同的日子也许我会写那个。不过,有些人对隐式 bool -> int 转换有点不确定。
    • @orlp,啊,我还以为和性能有关呢
    【解决方案5】:

    尝试列表理解

    total_files = sum(len(dirData[2]) for dirData in walk(image_file_path))
    

    【讨论】:

    • OP 的原始代码比这个建议更 Pythonic/惯用,部分原因是这个代码甚至不起作用。你是说sum([len(file_names) for (dir_path, dir_names, file_names) in walk('.')]) 吗?
    • @DeepSpace 我只是建议使用单线,仅此而已。
    • 但它确实工作。它尝试对函数列表求和。
    • @DeepSpace 谢谢,出现错误,已修复并更新。它现在应该可以工作了。
    猜你喜欢
    • 2010-09-16
    • 1970-01-01
    • 1970-01-01
    • 2014-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多