中級編をマスターしたあなたへ!globの可能性をさらに広げよう
初級編、中級編を通して、glob モジュールの基本的な使い方から応用的なテクニックまでを学んできました。
- globの基本的な使い方を知りたい方はこちらから
【Python 初級】ファイル検索の超入門!globモジュールで簡単ファイル操作
上級編では、さらに高度な glob の活用方法として、以下の内容を解説します。これらのテクニックを習得することで、より複雑なファイル操作や効率的なスクリプト作成が可能になります。
この記事で学べること
root_dir引数を使った検索基準ディレクトリの指定os.pathモジュールと連携したファイル名やディレクトリ名の抽出globを活用した実践的なファイル操作の例- 大量ファイル処理時のパフォーマンスに関する考慮事項
- パスの区切り文字や権限に関する注意点
検索の起点を変える!root_dir 引数
glob.glob() と glob.iglob() 関数には、検索の基準となるディレクトリを指定できる root_dir 引数があります。これにより、現在のスクリプトが実行されているディレクトリとは異なる場所を起点として、パターンマッチングを実行し、結果として root_dir からの相対パスを取得できます。
import glob
# 'data' フォルダ内に 'info.txt' がある場合
txt_files = glob.glob('*.txt', root_dir='data')
print(txt_files) # 出力: ['info.txt']
コード解説:
txt_files = glob.glob('*.txt', root_dir='data'):glob.glob('*.txt', ...): 通常は現在のディレクトリにある.txtファイルを探しますが、root_dir='data':dataフォルダを検索の起点として指定しています。- 結果として、
dataフォルダ内の.txtファイル名('info.txt'など)がリストとしてtxt_filesに格納されます。
print(txt_files) # 出力: ['info.txt']: 検索結果を出力します。
os.path との連携:ファイル名やディレクトリ名を抽出
glob() 関数はファイルやディレクトリのパスを返しますが、ファイル名だけ、あるいはディレクトリ名だけが必要な場合は、os.path モジュールと連携します。
ファイル名のみを取得
os.path.basename() 関数は、パスから最後の要素(ファイル名またはディレクトリ名)を抽出します。
import glob
import os
for path in glob.glob('documents/*.pdf'):
filename = os.path.basename(path)
print(filename)
コード解説:
for path in glob.glob('documents/*.pdf')::documentsフォルダ内の.pdfファイルのパスを一つずつpathに格納します。filename = os.path.basename(path):os.path.basename()でpathからファイル名(例:report.pdf)を抽出します。print(filename): 抽出したファイル名を出力します。
ディレクトリ名のみを取得
os.path.isdir() 関数は、パスがディレクトリである場合に True を返します。
import glob
import os
for path in glob.glob('*'):
if os.path.isdir(path):
print(path)
コード解説:
for path in glob.glob('*'):: 現在のディレクトリのすべてのファイルとフォルダのパスをpathに格納します。if os.path.isdir(path)::pathがディレクトリであればTrueとなり、そのパスを出力します。
実践的な活用例
例1:特定の拡張子のファイルを別の拡張子に一括リネーム
import glob
import os
for filename in glob.glob('images/*.png'):
new_filename = filename.replace('.png', '.jpg')
os.rename(filename, new_filename)
print(f"Renamed {filename} to {new_filename}")
コード解説:
glob.glob('images/*.png'):imagesフォルダ内の.pngファイルを検索します。filename.replace('.png', '.jpg'): ファイル名の拡張子を.jpgに変更します。os.rename(filename, new_filename): ファイル名をリネームします。
例2:特定のパターンに合致するログファイルから日付情報を抽出
import glob
import re
log_files = glob.glob('log/app_*.log')
for log_file in log_files:
match = re.search(r'app_(\d{4}-\d{2}-\d{2}).log', log_file)
if match:
date = match.group(1)
print(f"Log file for: {date}")
コード解説:
glob.glob('log/app_*.log'):logフォルダ内のapp_で始まる.logファイルを検索します。re.search(r'app_(\d{4}-\d{2}-\d{2}).log', log_file): 正規表現でファイル名から日付 (YYYY-MM-DD) を抽出します。match.group(1): 抽出した日付部分を取得します。
glob利用時の注意点とパフォーマンス
- 大量ファイルと深い階層:
recursive=Trueと**は強力ですが、広範囲の検索は時間がかかることがあります。具体的なパターンで絞り込むか、glob.iglob()を検討しましょう。 - パスの区切り文字: パターンでは
/を推奨。Windows で\を使う場合はエスケープが必要です。os.path.join()で可搬性を高めましょう。 - 権限: スクリプト実行ユーザーに必要なファイルシステムアクセス権限があるか確認してください。
- 正規表現との違い: より複雑なパターンには
reモジュールを使いましょう。globはファイルパス取得、reは文字列操作です。
まとめ:globマスターへの道
この応用編では、glob モジュールをさらに深く理解し、実践的な場面で活用するための高度なテクニックと注意点を学びました。root_dir を使った柔軟な検索、os.path との連携による詳細なパス操作、そしてパフォーマンスへの配慮は、より効率的で信頼性の高いファイル操作を実現するために不可欠です。
glob モジュールを使いこなすことで、あなたはファイル操作に関する様々な課題をスマートに解決できるでしょう。ぜひ、今回学んだ知識を活かして、あなたのPythonプログラミングをさらに進化させてください。

コメント