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

计算Python中具有特定扩展名的文件数,python,file,count,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(

我对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
它工作正常,但循环对我来说似乎太多/太贵了。有没有更有效的方法

谢谢。

您的代码很好

是的,您需要在这些文件上循环以过滤掉.tif文件,但与扫描文件目录以首先查找这些文件的工作相比,在内存中的一个小数组上循环是微不足道的,您无论如何都必须这样做


我不担心优化这段代码。

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

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

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

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

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

这是一种“Pythonic”方法,可以根据您的目的调整您找到的示例。但是它不会比你一直使用的循环更快或更有效;这只是一个非常简洁的语法,或多或少是相同的。

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

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


从什么时候开始,“pythonic”这个术语描述了将完全可读的3行代码转换为一行嵌套for循环的例行程序,这至少需要5倍的时间才能理解并在过程中违反PEP8?因为人们一直在用Python做这类事情(这已经有相当长的一段时间了)。但请注意,我在引号中加了“Pythonic”(“Pythonic unquote”),因为Python中实际完成的工作和PEP8中指定的工作是两件不同的事情。谢谢。这同样有效,行数减少了1/5!即使价格一样,它看起来也更漂亮!:)<代码>全局1?为什么要使用未记录的函数?为什么不使用给出完全相同结果的
glob.glob
?@SilentGhost:glob.glob只需要一个参数,即路径名。在特定情况下,目录已经可用,因此不需要先加入它,这样glob就可以再次拆分它。此外,如果myPath中有一个glob字符,glob.glob将对其进行解释。实际上,此解决方案包括以“.tif”结尾的目录,您需要进行额外的筛选。对于那些不太明显的用户,您需要执行导入glob。Martin,你能把这个添加到解决方案中吗?用Python做事情最有效的方法通常是用C来做:)你不喜欢这其中的什么?“过度”是什么意思?“昂贵”是什么意思?这非常适合我的用例。谢谢
import fnmatch,os
num_files = len(fnmatch.filter(os.listdir(your_dir),'*.tif'))
print(num_files)