中級編をマスターしたあなたへ!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プログラミングをさらに進化させてください。
コメント