web-dev-qa-db-ja.com

Pythonで特定の拡張子を持つファイルの数を数える

私はPythonにかなり慣れており、特定のサブディレクトリにある.TIFファイルの数を数える最も効率的な方法を見つけようとしています。

検索を行ったところ、1つの例(私はテストしていません)が見つかりました。これは、ディレクトリ内のすべてのファイルをカウントすると主張しています。

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

正常に動作しますが、ループが過剰/高すぎるようです。これをより効率的に行う方法はありますか?

ありがとう。

35
Bryan Lewis

何かがディレクトリ内のすべてのファイルを反復処理し、コードかライブラリルーチンかに関係なく、すべてのファイル名を調べる必要があります。したがって、特定のソリューションに関係なく、それらはすべてほぼ同じコストになります。

コードが多すぎると思い、実際にサブディレクトリを再帰的に検索する必要がない場合は、globモジュールを使用できます。

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

この特定の使用例では、サブディレクトリを再帰的に検索したくない場合は、os.listdirを使用できます。

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

あなたのコードは大丈夫です。

はい、.tifファイルを除外するためにこれらのファイルをループする必要がありますが、小さなメモリ内配列をループすることは、最初にこれらのファイルを見つけるためにファイルディレクトリをスキャンする作業と比較すると無視できます。とにかくそれをしなければならない。

このコードを最適化する必要はありません。

5
Triptych

再帰的に検索する必要がある場合、またはその他の理由でglobモジュールを使用したくない場合は、

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

これは、あなたが見つけた例をあなたの目的に合わせる「Python的」な方法です。しかし、これまで使用してきたループよりも大幅に高速化または効率化されることはありません。それは多かれ少なかれ同じことのための本当にコンパクトな構文です。

3
David Z

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)
2
pyBomb