我是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
它工作正常,但循环对我来说似乎过多/昂贵。任何方式更有效地做到这一点?
感谢。
答案 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)