【Python 上級】glob徹底活用:root_dir、os.path連携、パフォーマンス最適化

スポンサーリンク

中級編をマスターしたあなたへ!globの可能性をさらに広げよう

初級編、中級編を通して、glob モジュールの基本的な使い方から応用的なテクニックまでを学んできました。

上級編では、さらに高度な glob の活用方法として、以下の内容を解説します。これらのテクニックを習得することで、より複雑なファイル操作や効率的なスクリプト作成が可能になります。

スポンサーリンク

この記事で学べること

  • root_dir 引数を使った検索基準ディレクトリの指定
  • os.path モジュールと連携したファイル名やディレクトリ名の抽出
  • glob を活用した実践的なファイル操作の例
  • 大量ファイル処理時のパフォーマンスに関する考慮事項
  • パスの区切り文字や権限に関する注意点

検索の起点を変える!root_dir 引数

glob.glob()glob.iglob() 関数には、検索の基準となるディレクトリを指定できる root_dir 引数があります。これにより、現在のスクリプトが実行されているディレクトリとは異なる場所を起点として、パターンマッチングを実行し、結果として root_dir からの相対パスを取得できます。

Python

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() 関数は、パスから最後の要素(ファイル名またはディレクトリ名)を抽出します。

Python

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 を返します。

Python

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:特定の拡張子のファイルを別の拡張子に一括リネーム

Python

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:特定のパターンに合致するログファイルから日付情報を抽出

Python

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プログラミングをさらに進化させてください。

スポンサーリンク

コメント

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