【Python 中級】glob応用:ワイルドカード、サブフォルダ検索でファイル操作を効率化

スポンサーリンク

初級編をクリアしたあなたへ!globをもっと深く使いこなそう

初級編では、glob モジュールの基本的な使い方とワイルドカード *? を使ったファイル検索を学びました。

中級編では、さらに複雑なパターンマッチングを可能にするワイルドカードや、サブフォルダを検索する方法など、glob モジュールの応用的な使い方を解説します。

スポンサーリンク

この記事で学べること

  • [][!...] などの高度なワイルドカードの使い方
  • サブフォルダを再帰的に検索する方法 (recursive=True**)
  • glob.iglob() を使ったメモリ効率の良い検索方法

より複雑なパターンマッチング:高度なワイルドカード

glob モジュールでは、より細かな条件でファイルを検索するために、以下のワイルドカードを利用できます。

  • [文字セット]: 角括弧内のいずれか1文字にマッチします。
    • 例:[abc].txta.txtb.txtc.txt にマッチ
  • [開始-終了]: 指定した範囲内のいずれか1文字にマッチします。
    • 例:file[0-9].logfile0.logfile9.log などにマッチ
  • [!文字セット] または [^文字セット]: 角括弧内の文字セットに含まれない任意の1文字にマッチします。
    • 例:data[!0-9].csvdataa.csv などにマッチ

例:ファイル名が file で始まり、次の1文字が 123 で、.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]123 のいずれか1文字にマッチするため、file1.txtfile2.txtfile3.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.pngimagex.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 モジュールをさらに活用するためのテクニックや、注意点、パフォーマンスに関する考慮事項について解説します。

スポンサーリンク

コメント

タイトルとURLをコピーしました