大量の業務ファイルを手作業で整理するのは時間もかかり、誤って移動先を間違える危険がございます。ここでは pathlib と 正規表現(re) を活用し、「ファイル名に含まれる年月 (YYYYMM)」をキーに 月ごとのサブフォルダーへ自動仕分け する方法をご紹介いたします。
目次
想定ディレクトリー構成
root/
└─ reports/
├─ sales_202401.xlsx
├─ cost_202401.xlsx
├─ sales_202402.xlsx
└─ …
実行後は次のように reports/202401/ や reports/202402/ が生成され、それぞれに対応するファイルが移動されます。
スクリプト
from pathlib import Path
import re
# 1. 処理対象ディレクトリーを指定
base_dir = Path('./reports')
# 2. 対象拡張子を絞り込みながらループ
for xlsx_path in base_dir.glob('*.xlsx'):
file_label = xlsx_path.name
# 3. ファイル名から「YYYYMM」を抽出
matched = re.search(r'20\d{4}', file_label)
if matched is None:
continue # 年月が見つからなければスキップ
month_code = matched.group(0) # 例: '202401'
# 4. 月別フォルダーを作成(既存ならスキップ)
dest_folder = base_dir / month_code
dest_folder.mkdir(exist_ok=True)
# 5. ファイルを移動(rename)
destination = dest_folder / file_label
xlsx_path.rename(destination)
各ステップのご説明
手順 | 内容 | 解説 |
---|---|---|
1 | Path('./reports') | 整理対象フォルダーを pathlib で表現いたします。 |
2 | glob('*.xlsx') | .xlsx のみを対象とするため、PDF 等が混在していても誤処理を防ぎます。 |
3 | re.search(r'20\d{4}', file_label) | 20xx 年を前提に YYYYMM (数字 6 桁)を抽出いたします。 |
4 | mkdir(exist_ok=True) | 目的の月フォルダーが無い場合のみ作成し、既に存在する場合はエラーになりません。 |
5 | rename() | 同一ドライブ上での移動は高速で安全に行えます。 |
応用アイデア
ニーズ | 実装例 |
---|---|
日付を “YYYY‑MM” 形式にしたい | 正規表現を `r’20\d{2}(0[1-9] |
階層全体から再帰的に検索 | base_dir.rglob('*.xlsx') を使用すると、サブフォルダーも含めて対象を抽出できます。 |
移動ではなくコピー | shutil.copy2(xlsx_path, destination) を利用し、オリジナルを残したまま整理できます。 |
まとめ
- pathlib でファイル・フォルダー操作を簡潔に表現し、可読性と OS 依存性を低減できます。
- 正規表現 を併用することで、ファイル名から柔軟に年月コードを取得できます。
- 定期実行(バッチ/タスクスケジューラ)へ組み込むことで、ファイル整理の自動化が実現し、日々の保守負担を軽減いたします。