初級編をクリアしたあなたへ!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
モジュールをさらに活用するためのテクニックや、注意点、パフォーマンスに関する考慮事項について解説します。
コメント