[Python] globモジュールの使い方 – ファイルの正規表現検索
globモジュールは、ファイルパスのパターンマッチングを行うためのPython標準ライブラリです。
ワイルドカード(例: *
, ?
, []
)を使用して、特定の条件に一致するファイルやディレクトリを検索できます。
glob.glob()
関数は指定したパターンに一致するパスのリストを返し、recursive=True
を指定すると再帰的な検索も可能です。
iglob()
はイテレータを返します。
globモジュールとは
glob
モジュールは、Pythonにおいてファイル名のパターンマッチングを行うための便利なツールです。
このモジュールを使用することで、特定のディレクトリ内のファイルを簡単に検索したり、フィルタリングしたりすることができます。
特に、ワイルドカード*
や?
を使った検索が可能で、正規表現のように柔軟なファイル名の指定ができます。
主な特徴
- ワイルドカードの使用:
*
(任意の文字列)や?
(任意の1文字)を使ってファイル名を指定できます。 - 簡単なインターフェース: シンプルな関数を使って、直感的にファイルを検索できます。
- 再帰的検索: サブディレクトリ内のファイルも検索対象に含めることができます。
このモジュールは、特に大量のファイルを扱う際や、特定の条件に合ったファイルを見つけたい場合に非常に役立ちます。
次のセクションでは、glob
モジュールの基本的な使い方について詳しく見ていきます。
globモジュールの基本的な使い方
glob
モジュールを使用するためには、まずPythonのスクリプト内でインポートする必要があります。
基本的な使い方は非常にシンプルで、glob.glob()
関数を使って指定したパターンにマッチするファイルのリストを取得します。
以下に基本的な使用例を示します。
インポートと基本的な使用例
import glob
# カレントディレクトリ内の全てのテキストファイルを取得
file_list = glob.glob("*.txt")
# 結果を表示
print(file_list)
このコードでは、カレントディレクトリ内の全ての.txt
ファイルを検索し、その結果をリストとして取得しています。
出力結果は、ディレクトリ内に存在するテキストファイルの名前のリストになります。
['file1.txt', 'file2.txt', 'notes.txt']
使用できるワイルドカード
glob
モジュールでは、以下のようなワイルドカードを使用できます。
ワイルドカード | 説明 | 例 |
---|---|---|
* | 任意の文字列 | *.jpg (全てのJPEGファイル) |
? | 任意の1文字 | file?.txt (file1.txt, file2.txt) |
[] | 指定した文字のいずれか1文字 | file[1-3].txt (file1.txt, file2.txt, file3.txt) |
このように、glob
モジュールを使うことで、特定のパターンにマッチするファイルを簡単に取得することができます。
次のセクションでは、再帰的な検索について詳しく見ていきます。
再帰的な検索
glob
モジュールでは、再帰的にファイルを検索することも可能です。
これにより、指定したディレクトリだけでなく、そのサブディレクトリ内のファイルも検索対象に含めることができます。
再帰的な検索を行うには、glob.glob()
関数に**
を使用し、recursive=True
オプションを指定します。
再帰的検索の使用例
以下のコードは、カレントディレクトリおよびそのサブディレクトリ内の全ての.py
ファイルを検索する例です。
import glob
# カレントディレクトリとサブディレクトリ内の全てのPythonファイルを取得
file_list = glob.glob("**/*.py", recursive=True)
# 結果を表示
print(file_list)
このコードを実行すると、カレントディレクトリとそのサブディレクトリ内に存在する全てのPythonファイルのリストが得られます。
['script1.py', 'subdir/script2.py', 'subdir/subsubdir/script3.py']
再帰的検索の利点
- 広範囲な検索: サブディレクトリを含めることで、より多くのファイルを一度に検索できます。
- 効率的な管理: 大規模なプロジェクトや多層ディレクトリ構造の中で、特定のファイルを見つけるのが容易になります。
再帰的な検索を活用することで、ファイル管理がより効率的になります。
次のセクションでは、iglob()
の使い方について詳しく見ていきます。
iglob()の使い方
glob
モジュールには、glob()
関数の他にiglob()
関数も用意されています。
iglob()
は、指定したパターンにマッチするファイル名をイテレータとして返すため、大量のファイルを扱う際にメモリ効率が良いという特徴があります。
glob()
が全ての結果をリストとして返すのに対し、iglob()
は必要な時に必要な分だけを生成します。
iglob()の基本的な使用例
以下のコードは、カレントディレクトリ内の全ての.txt
ファイルをiglob()
を使って検索する例です。
import glob
# カレントディレクトリ内の全てのテキストファイルをイテレータとして取得
file_iterator = glob.iglob("*.txt")
# 結果を表示
for file in file_iterator:
print(file)
このコードを実行すると、カレントディレクトリ内の全てのテキストファイルが1つずつ表示されます。
file1.txt
file2.txt
notes.txt
iglob()の利点
- メモリ効率: 大量のファイルを扱う際に、全てを一度にメモリに読み込む必要がないため、メモリ使用量を抑えられます。
- 遅延評価: 必要なファイルだけをその都度生成するため、処理の効率が向上します。
iglob()
を使用することで、特に大規模なファイルシステムでの検索がより効率的になります。
次のセクションでは、実践的な使用例について詳しく見ていきます。
実践的な使用例
glob
モジュールは、さまざまなシナリオで活用できます。
ここでは、実際のプロジェクトで役立ついくつかの使用例を紹介します。
これにより、glob
モジュールの使い方をより具体的に理解できるでしょう。
画像ファイルの収集
特定のディレクトリ内の全ての画像ファイル(JPEGおよびPNG)を収集する例です。
import glob
# カレントディレクトリ内の全てのJPEGおよびPNGファイルを取得
image_files = glob.glob("*.jpg") + glob.glob("*.png")
# 結果を表示
print("画像ファイル:")
for image in image_files:
print(image)
画像ファイル:
photo1.jpg
photo2.png
特定の拡張子を持つファイルの削除
特定の拡張子(例: .tmp
)を持つファイルを削除するスクリプトの例です。
import glob
import os
# カレントディレクトリ内の全ての一時ファイルを取得
temp_files = glob.glob("*.tmp")
# 一時ファイルを削除
for temp_file in temp_files:
os.remove(temp_file)
print(f"{temp_file} を削除しました。")
temp1.tmp を削除しました。
temp2.tmp を削除しました。
サブディレクトリ内の特定のファイルをリストアップ
再帰的にサブディレクトリ内の全てのPythonファイルをリストアップする例です。
import glob
# サブディレクトリ内の全てのPythonファイルを取得
python_files = glob.glob("**/*.py", recursive=True)
# 結果を表示
print("Pythonファイル:")
for python_file in python_files:
print(python_file)
Pythonファイル:
script1.py
subdir/script2.py
subdir/subsubdir/script3.py
これらの実践的な使用例を通じて、glob
モジュールの多様な活用方法を理解できたと思います。
次のセクションでは、注意点とベストプラクティスについて詳しく見ていきます。
注意点とベストプラクティス
glob
モジュールを使用する際には、いくつかの注意点やベストプラクティスがあります。
これらを理解しておくことで、より効率的かつ安全にファイル操作を行うことができます。
以下に主なポイントをまとめました。
パターンの正確性
- ワイルドカードの使用: ワイルドカード
*
や?
を使用する際は、意図したファイルのみがマッチするようにパターンを正確に指定することが重要です。
誤ったパターンを指定すると、予期しないファイルが検索結果に含まれる可能性があります。
大量のファイルを扱う際の注意
- メモリ使用量:
glob()
は全ての結果をリストとして返すため、大量のファイルを扱う場合はiglob()
を使用することを推奨します。
これにより、メモリ使用量を抑えつつ、必要なファイルを逐次処理できます。
ファイルの存在確認
- ファイルの存在確認:
glob
で取得したファイルリストを操作する前に、ファイルが実際に存在するかどうかを確認することが重要です。
特に、削除や移動などの操作を行う場合は、ファイルが存在しないとエラーが発生します。
絶対パスの使用
- 絶対パスの利用: 相対パスを使用する場合、カレントディレクトリが変更されると意図しない結果を招くことがあります。
可能であれば、絶対パスを使用してファイルを指定することをお勧めします。
エラーハンドリング
- エラーハンドリング: ファイル操作を行う際は、例外処理を実装することが重要です。
特に、ファイルの削除や移動などの操作では、ファイルが存在しない場合やアクセス権がない場合にエラーが発生することがあります。
import glob
import os
try:
# カレントディレクトリ内の全ての一時ファイルを取得
temp_files = glob.glob("*.tmp")
# 一時ファイルを削除
for temp_file in temp_files:
os.remove(temp_file)
print(f"{temp_file} を削除しました。")
except Exception as e:
print(f"エラーが発生しました: {e}")
これらの注意点とベストプラクティスを守ることで、glob
モジュールをより安全かつ効果的に活用することができます。
次のセクションでは、glob
モジュールのさらなる活用方法について考えていきます。
まとめ
この記事では、Pythonのglob
モジュールを使ったファイルの正規表現検索について詳しく解説しました。
基本的な使い方から再帰的な検索、iglob()
の活用法、実践的な使用例、そして注意点やベストプラクティスまで幅広く取り上げました。
これを機に、ファイル操作をより効率的に行うためにglob
モジュールを活用してみてください。
新たなプロジェクトやタスクにおいて、glob
を使ったファイル検索が役立つことでしょう。