Python(pathlib + re)で多数の Excel ブックを “月別フォルダー” に自動振り分けする手順

大量の業務ファイルを手作業で整理するのは時間もかかり、誤って移動先を間違える危険がございます。ここでは 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)

各ステップのご説明

手順内容解説
1Path('./reports')整理対象フォルダーを pathlib で表現いたします。
2glob('*.xlsx').xlsx のみを対象とするため、PDF 等が混在していても誤処理を防ぎます。
3re.search(r'20\d{4}', file_label)20xx 年を前提に YYYYMM(数字 6 桁)を抽出いたします。
4mkdir(exist_ok=True)目的の月フォルダーが無い場合のみ作成し、既に存在する場合はエラーになりません。
5rename()同一ドライブ上での移動は高速で安全に行えます。

応用アイデア

ニーズ実装例
日付を “YYYY‑MM” 形式にしたい正規表現を `r’20\d{2}(0[1-9]
階層全体から再帰的に検索base_dir.rglob('*.xlsx') を使用すると、サブフォルダーも含めて対象を抽出できます。
移動ではなくコピーshutil.copy2(xlsx_path, destination) を利用し、オリジナルを残したまま整理できます。

まとめ

  • pathlib でファイル・フォルダー操作を簡潔に表現し、可読性と OS 依存性を低減できます。
  • 正規表現 を併用することで、ファイル名から柔軟に年月コードを取得できます。
  • 定期実行(バッチ/タスクスケジューラ)へ組み込むことで、ファイル整理の自動化が実現し、日々の保守負担を軽減いたします。
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次