ファイル名の一部を移動させて変換する
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)のように再利用できる。