2024年5月25日土曜日

Pythonスクリプトでファイル名を置換する

ファイル名の一部を移動させて変換する

Pythonスクリプト「報告書_20240523.pdf」 のようなファイル名を 「20240523_報告書.pdf」 に変換するスクリプトをChatGPT-4oに相談して作り理解したのでメモ. シェルスクリプトよりも理解し易い気がする.

スクリプト


import os
import re

# 変更したいファイルが存在するディレクトリを指定
directory = './'  # カレントディレクトリを指定

# ファイル名のパターンを定義
pattern = re.compile(r'(.+)\_([0-9]{8})(.*)(\.pdf)')

# ディレクトリ内のすべてのファイルをループ
for filename in os.listdir(directory):
    # ファイル名がパターンに一致するか確認
    print(filename)
    match = pattern.match(filename)
    if match:
        # 新しいファイル名を構築
        new_name = f"{match.group(2)}_{match.group(1)}{match.group(3)}.pdf"
        # ファイルのパスを構築
        old_file = os.path.join(directory, filename)
        new_file = os.path.join(directory, new_name)
        # ファイル名を変更
        os.rename(old_file, new_file)
        print(f"-> {new_name}")

解説

ファイル名は次のように分解できる。

(部分A)_(部分B).(拡張子)

これを

(部分B)_(部分A).(拡張子)

に変換したいだけだけど、(部分B)が「20240525」のような数字8文字だということを利用する。 (部分Aは)「(.+)」、(部分B)は「([0-9]{8})」でマッチさせる。どちらも丸括弧()で囲うことで、キャプチャグループという単位にすることができて、後でmatch.group(1)のように再利用できる。