Pythonでファイルの拡張子を指定してファイルを探すことはよくある作業です。この記事では、様々なニーズやコーディングスタイルに対応する、効率的で汎用性の高いいくつかの方法を探ります。様々なPythonモジュールとテクニックを網羅し、特定のユースケースに最適なアプローチを選択できるようにします。
目次
1. glob
モジュールの使用
glob
モジュールは、単一ディレクトリ内で定義されたパターンに一致するファイルを見つける簡潔な方法を提供します。そのglob()
関数は、パターンを満たすパスのリストを返します。
import glob
def find_files_with_extension_glob(directory, extension):
"""glob.glob()を使って拡張子が一致するファイルを見つけます"""
return glob.glob(f"{directory}/*{extension}")
# 例:
files = find_files_with_extension_glob("./my_directory", ".txt")
print(files)
2. os
モジュールの活用
os
モジュールは、より詳細な制御を提供します。os.listdir()
はディレクトリ内のすべてのエントリをリストし、カスタムフィルタリングを可能にします。
import os
def find_files_with_extension_os(directory, extension):
"""os.listdir()を使って拡張子が一致するファイルを見つけます"""
files = []
for filename in os.listdir(directory):
if filename.endswith(extension):
files.append(os.path.join(directory, filename))
return files
# 例:
files = find_files_with_extension_os("./my_directory", ".txt")
print(files)
3. 単一ディレクトリ検索のためのpathlib
の利用
pathlib
モジュールはオブジェクト指向のアプローチを提供します。そのglob()
メソッドは、glob.glob()
よりもクリーンな構文を提供します。
from pathlib import Path
def find_files_with_extension_pathlib(directory, extension):
"""pathlib.glob()を使って拡張子が一致するファイルを見つけます"""
return list(Path(directory).glob(f"*{extension}"))
# 例:
files = find_files_with_extension_pathlib("./my_directory", ".txt")
print(files)
4. os.walk
による再帰的な検索
サブディレクトリを検索するには、os.walk()
がディレクトリツリーをトラバースし、各ファイルで目的の拡張子を確認できます。
import os
def find_files_recursive_os(directory, extension):
"""os.walk()を使って拡張子が一致するファイルを再帰的に検索します"""
files = []
for root, _, filenames in os.walk(directory):
for filename in filenames:
if filename.endswith(extension):
files.append(os.path.join(root, filename))
return files
# 例:
files = find_files_recursive_os("./my_directory", ".txt")
print(files)
5. pathlib.rglob
による再帰的な検索
pathlib
のrglob()
メソッドは、再帰的な検索のための最もエレガントなソリューションを提供します。
from pathlib import Path
def find_files_recursive_pathlib(directory, extension):
"""pathlib.rglob()を使って拡張子が一致するファイルを再帰的に検索します"""
return list(Path(directory).rglob(f"*{extension}"))
# 例:
files = find_files_recursive_pathlib("./my_directory", ".txt")
print(files)
例が正しく動作するように、「my_directory」フォルダにいくつかの.txtファイルを作成してください。コーディングスタイルとプロジェクトの要求に最適な方法を選択してください。単純な単一ディレクトリ検索の場合、glob
またはpathlib.glob()
は優れた選択肢です。再帰的な検索の場合、pathlib.rglob()
は最も簡潔で読みやすいソリューションです。