初級編をクリアしたあなたへ!globをもっと深く使いこなそう
初級編では、glob モジュールの基本的な使い方とワイルドカード *、? を使ったファイル検索を学びました。
中級編では、さらに複雑なパターンマッチングを可能にするワイルドカードや、サブフォルダを検索する方法など、glob モジュールの応用的な使い方を解説します。
この記事で学べること
[]、[!...]などの高度なワイルドカードの使い方- サブフォルダを再帰的に検索する方法 (
recursive=Trueと**) glob.iglob()を使ったメモリ効率の良い検索方法
より複雑なパターンマッチング:高度なワイルドカード
glob モジュールでは、より細かな条件でファイルを検索するために、以下のワイルドカードを利用できます。
[文字セット]: 角括弧内のいずれか1文字にマッチします。- 例:
[abc].txtはa.txt、b.txt、c.txtにマッチ
- 例:
[開始-終了]: 指定した範囲内のいずれか1文字にマッチします。- 例:
file[0-9].logはfile0.log、file9.logなどにマッチ
- 例:
[!文字セット]または[^文字セット]: 角括弧内の文字セットに含まれない任意の1文字にマッチします。- 例:
data[!0-9].csvはdataa.csvなどにマッチ
- 例:
例:ファイル名が file で始まり、次の1文字が 1 か 2 か 3 で、.txt で終わるファイルを検索
Python
import glob
specific_files = glob.glob('file[1-3].txt')
print(specific_files)
コード解説:
specific_files = glob.glob('file[1-3].txt'):glob.glob()関数に'file[1-3].txt'というパターンを渡しています。[1-3]は1、2、3のいずれか1文字にマッチするため、file1.txt、file2.txt、file3.txtなどがリストとしてspecific_files変数に格納されます。print(specific_files):specific_files変数に格納されたリストの内容を出力します。
例:ファイル名が image で始まり、次の1文字が数字以外で、.png で終わるファイルを検索
Python
import glob
image_files = glob.glob('image[!0-9].png')
print(image_files)
コード解説:
image_files = glob.glob('image[!0-9].png'):glob.glob()関数に'image[!0-9].png'というパターンを渡しています。[!0-9]は数字以外の任意の1文字にマッチするため、imagea.png、imagex.pngなどがリストとしてimage_files変数に格納されます。print(image_files):image_files変数に格納されたリストの内容を出力します。
サブフォルダもまとめて検索!recursive=True と **
Python 3.5以降では、glob.glob() 関数に recursive=True 引数を指定することで、サブフォルダの中まで再帰的に検索できます。さらに、パターンの中で ** を使うと、「0個以上のディレクトリを含むすべてのファイル」という意味になります。
例:project フォルダとそのサブフォルダにあるすべての .py ファイルを検索
Python
import glob
py_files = glob.glob('project/**/*.py', recursive=True)
print(py_files)
コード解説:
py_files = glob.glob('project/**/*.py', recursive=True):'project/**/*.py':projectフォルダ以下のすべてのディレクトリ(サブディレクトリを含む)にある、拡張子が.pyのファイルにマッチするパターンです。**が再帰的な検索を示します。recursive=True: 再帰検索を有効にするための引数です。- したがって、
projectフォルダとそのすべてのサブフォルダにある.pyファイルのパスがリストとしてpy_files変数に格納されます。
print(py_files):py_files変数に格納されたリストの内容を出力します。
メモリを節約!glob.iglob() の使い方
大量のファイルを扱う場合、glob.glob() はすべての結果をリストとしてメモリに読み込むため、メモリを圧迫する可能性があります。そんな時は、glob.iglob() 関数を使うと便利です。glob.iglob() は、結果を一つずつ生成するイテレータを返すため、メモリ使用量を抑えられます。
Python
import glob
for log_file in glob.iglob('log_files/*.log'):
print(f"Processing: {log_file}")
# 各ログファイルに対する処理
コード解説:
for log_file in glob.iglob('log_files/*.log')::glob.iglob()関数に'log_files/*.log'というパターンを渡しています。これは、log_filesフォルダ内にある拡張子が.logのファイルにマッチするイテレータを返します。for ... in ...:: このforループは、glob.iglob()が生成するファイルパスを一つずつlog_file変数に格納して処理を行います。すべてのファイルパスを事前にメモリに読み込むわけではないため、メモリ使用量を抑えることができます。print(f"Processing: {log_file}"): 現在処理しているログファイルの名前を出力します。# 各ログファイルに対する処理: ここに、取得した各ログファイルに対して行いたい処理(例:ファイルを開いて内容を読み込む、特定の情報を抽出するなど)を記述します。
まとめ:globでより高度なファイル検索をマスター!
この中級編では、[] などの高度なワイルドカード、サブフォルダの再帰的な検索方法、そしてメモリ効率の良い glob.iglob() の使い方を学びました。これらのテクニックを習得することで、より複雑な条件でのファイル検索や、大量のファイルを扱う際の効率的な処理が可能になります。
次の記事(上級編)では、glob モジュールをさらに活用するためのテクニックや、注意点、パフォーマンスに関する考慮事項について解説します。

コメント