【问题标题】:Count number of files with certain extension in Python计算Python中具有特定扩展名的文件数
【发布时间】:2010-11-22 04:28:56
【问题描述】:

我对 Python 还很陌生,我正在尝试找出计算特定子目录中 .TIF 文件数量的最有效方法。

做了一些搜索,我找到了一个例子(我没有测试过),它声称计算一个目录中的所有文件:

file_count = sum((len(f) for _, _, f in os.walk(myPath)))

这很好,但我只需要计算 TIF 文件。我的目录将包含其他文件类型,但我只想计算 TIF。

目前我正在使用以下代码:

tifCounter = 0
for root, dirs, files in os.walk(myPath):
    for file in files:    
        if file.endswith('.tif'):
            tifCounter += 1

它工作正常,但循环对我来说似乎过度/昂贵。有什么方法可以更有效地做到这一点?

谢谢。

【问题讨论】:

  • 用 Python 做事最有效的方法通常是用 C 做。:)
  • 你不喜欢这个? “过分”是什么意思? “贵”是什么意思?

标签: python file count


【解决方案1】:

必须对目录中的所有文件进行迭代,并查看每个文件名——无论是您的代码还是库例程。因此,无论具体的解决方案是什么,它们的成本都大致相同。

如果您认为代码太多,并且实际上不需要递归搜索子目录,则可以使用glob 模块:

import glob
tifCounter = len(glob.glob1(myPath,"*.tif"))

【讨论】:

  • 谢谢。这同样有效,并且只有 1/5 的行数!即使价格相同,它看起来更漂亮! :)
  • glob1?为什么要使用未记录的功能?为什么不使用给出完全相同结果的glob.glob
  • @SilentGhost:glob.glob 只需要一个参数,即路径名。具体情况下,目录已经可用了,不需要先加入,glob可以再次拆分。此外,如果 myPath 中有一个 glob 字符,glob.glob 会解释它。
  • 其实这个方案包括以'.tif'结尾的目录,需要额外过滤一下。
  • 对于那些不是很明显的人,您需要导入 glob。马丁,您能否将其添加到解决方案中。
【解决方案2】:

尝试使用 fnmatch https://docs.python.org/2/library/fnmatch.html

import fnmatch,os
num_files = len(fnmatch.filter(os.listdir(your_dir),'*.tif'))
print(num_files)

【讨论】:

  • 这非常适合我的用例。谢谢!
【解决方案3】:

对于这个特定的用例,如果你不想在子目录中递归搜索,你可以使用os.listdir

len([f for f in os.listdir(myPath) 
     if f.endswith('.tif') and os.path.isfile(os.path.join(myPath, f))])

【讨论】:

    【解决方案4】:

    如果您确实需要递归搜索,或者由于某些其他原因不想使用glob 模块,您可以使用

    file_count = sum(len(f for f in fs if f.lower().endswith('.tif')) for _, _, fs in os.walk(myPath))
    

    这是根据您的目的调整您找到的示例的“Pythonic”方式。但它不会比您一直使用的循环更快或更有效。它只是一个非常紧凑的语法,或多或少是相同的东西。

    【讨论】:

    • 从什么时候开始,“pythonic”这个术语描述了将完全可读的 3 行代码转换为单行嵌套 for 循环的例程,该循环需要至少 5 倍的时间来理解并违反 PEP8过程?
    • 自从人们在 Python 中做这种事情以来(已经有一段时间了)。但请注意,我将“Pythonic”放在引号中(“quote-Pythonic-unquote”),因为在 Python 中实际完成的操作和 PEP 8 中指定的操作是两件不同的事情。
    【解决方案5】:

    您的代码很好。

    是的,您将需要遍历这些文件以过滤掉 .tif 文件,但与扫描文件目录以在第一名,无论如何你都必须这样做。

    我不会担心优化这段代码。

    【讨论】:

      猜你喜欢
      • 2021-02-14
      • 1970-01-01
      • 2011-06-30
      • 1970-01-01
      • 2010-12-28
      • 1970-01-01
      • 2016-12-18
      • 2017-05-09
      • 2020-06-06
      相关资源
      最近更新 更多