计算Python中具有特定扩展名的文件数

时间:2009-08-24 06:20:54

标签: python file count

我是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

它工作正常,但循环对我来说似乎过多/昂贵。任何方式更有效地做到这一点?

感谢。

5 个答案:

答案 0 :(得分:42)

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

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

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

答案 1 :(得分:6)

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

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

答案 2 :(得分:5)

你的代码很好。

是的,您需要循环遍历这些文件以过滤掉.tif文件,但是与扫描文件目录以查找这些文件相比,在小内存阵列上循环可以忽略不计。无论如何你必须做的第一个地方。

我不担心优化此代码。

答案 3 :(得分:3)

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

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

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

答案 4 :(得分: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)