特定の拡張子を持つファイルを Python でのみ見つける方法
- 
          
            glob.globファイル検索方法
- 
          
            os.listdir()ファイル検索方法
- 
          
            pathlib.globファイル検索方法
- Python のディレクトリおよびそのサブディレクトリで特定の拡張子を持つファイルを検索する
- 
          
            pathlibモジュールファイルを再帰的に検索する
 
この記事では、Python でのみ特定の拡張子を持つファイルを見つけるためのさまざまな方法を紹介します。
glob.glob ファイル検索方法
    
glob.glob モジュールを使用して、Python でのみ特定の拡張子を持つファイルを見つけることができます。
import glob
targetPattern = r"C:\Test\*.txt"
glob.glob(targetPattern)
上記のコードは、ディレクトリ C:\Test に拡張子 txt を持つファイルを見つける方法を示しています。
os.listdir() ファイル検索方法
os.listdir() 関数は、指定されたディレクトリ内のすべてのファイルをリストしますが、ファイルパス情報は含まれません。str.endswith() 関数を使用して、特定の拡張子を持つファイルを抽出できます。
>>> import os
>>> fileDir = r"C:\Test"
>>> fileExt = r".txt"
>>> [_ for _ in os.listdir(fileDir) if _.endswith(fileExt)]
['test.txt', 'test1.txt']
os.path.join() 関数を使用してフルパスを作成する必要があります。
>>> import os
>>> fileDir = r"C:\Test"
>>> fileExt = r".txt"
>>> [os.path.join(fileDir, _) for _ in os.listdir(fileDir) if _.endswith(fileExt)]
['C:\\Test\\test.txt', 'C:\\Test\\test1.txt']
pathlib.glob ファイル検索方法
pathlib モジュール は Python 3.4 で導入され、オブジェクト指向のファイルシステムパスを提供します。これには、Windows OS の Windows パスと Unix 類似システムの POSIX パスの 2つのスタイルがあります。
>>> import pathlib
>>> fileDir = r"C:\Test"
>>> fileExt = r"*.txt"
>>> list(pathlib.Path(fileDir).glob(fileExt))
[WindowsPath('C:/Test/test.txt'), WindowsPath('C:/Test/test1.txt')]
結果は WindowsPath で表され、str() 関数で結果を文字列表現に変換できます。例えば、
>>> [str(_) for _ in pathlib.Path(fileDir).glob(fileExt)]
['C:\\Test\\test.txt', 'C:\\Test\\test.txt']
Python のディレクトリおよびそのサブディレクトリで特定の拡張子を持つファイルを検索する
C:\Test\*.txt のパターンは、C:\Test ディレクトリ内の txt ファイルのみを検索し、そのサブディレクトリ内は検索しません。サブディレクトリ内の txt ファイルも検索する場合は、パターンを少し変更することができます。
import glob
targetPattern = r"C:\Test\**\*.txt"
glob.glob(targetPattern)
Test と \*.txt の間のワイルドカード ** は、ディレクトリとそのサブディレクトリで txt ファイルを見つけることを意味します。
pathlib モジュールファイルを再帰的に検索する
ファイルを再帰的に検索するために glob.glob に ** を追加するのと同様に、pathlib.Path.glob メソッドに**を追加して、特定の拡張子を持つファイルを再帰的に検索することもできます。
>>> import pathlib
>>> fileDir = r"C:\Test"
>>> fileExt = r"**\*.txt"
>>> list(pathlib.Path(fileDir).glob(fileExt))
[WindowsPath('C:/Test/test.txt'), WindowsPath('C:/Test/test1.txt'), WindowsPath('C:/Test/sub/test1.txt')]
