Bry*_*wis 34 python file count
我是Python的新手,我试图找出计算特定子目录中.TIF文件数量的最有效方法.
做了一些搜索,我发现了一个例子(我没有测试过),它声称要计算目录中的所有文件:
file_count = sum((len(f) for _, _, f in os.walk(myPath)))
Run Code Online (Sandbox Code Playgroud)
这很好,但我只需要计算TIF文件.我的目录将包含其他文件类型,但我只想计算TIF.
目前我使用以下代码:
tifCounter = 0
for root, dirs, files in os.walk(myPath):
for file in files:
if file.endswith('.tif'):
tifCounter += 1
Run Code Online (Sandbox Code Playgroud)
它工作正常,但循环对我来说似乎过多/昂贵.任何方式更有效地做到这一点?
谢谢.
Mar*_*wis 50
必须迭代目录中的所有文件,并查看每个文件名 - 无论是您的代码还是库例程.因此,无论具体解决方案是什么,它们都将具有大致相同的成本.
如果您认为代码太多,并且您实际上不需要递归搜索子目录,则可以使用该glob模块:
import glob
tifCounter = len(glob.glob1(myPath,"*.tif"))
Run Code Online (Sandbox Code Playgroud)
对于此特定用例,如果您不想在子目录中递归搜索,则可以使用os.listdir:
len([f for f in os.listdir(myPath)
if f.endswith('.tif') and os.path.isfile(os.path.join(myPath, f))])
Run Code Online (Sandbox Code Playgroud)
你的代码很好.
是的,您将需要循环遍历这些文件以过滤掉.tif文件,但是与扫描文件目录以查找这些文件的工作相比,在小内存阵列上循环可以忽略不计,无论如何你必须做.
我不担心优化此代码.
如果您确实需要递归搜索,或者由于其他原因不想使用该glob模块,您可以使用
file_count = sum(len(f for f in fs if f.lower().endswith('.tif')) for _, _, fs in os.walk(myPath))
Run Code Online (Sandbox Code Playgroud)
这是根据您的目的调整您找到的示例的“Pythonic”方式。但它不会比您一直使用的循环更快或更有效;它只是一个非常紧凑的语法,或多或少是相同的东西。