【Python】連番の最初のファイルの名前に1を後からつける
本記事では、同一ディレクトリで後から連番を開始したファイルがあった際に、一番目のファイルも連番にするコードを実装します。
具体的には、以下のような状況を解決することを目的にします。
Bad
root
├─hoge.pdf
├─hoge_2.pdf
├─hoge_3.pdf
├─hogehoge.pdf
├─fuga.pdf
├─fuga_2.pdf
└─fuga_3.pdf
Good
root
├─hoge_1.pdf
├─hoge_2.pdf
├─hoge_3.pdf
├─hogehoge.pdf
├─fuga_1.pdf
├─fuga_2.pdf
└─fuga_3.pdf
ZennやQiitaに近いようなテーマですが、技術として共有するほどの価値ある記事でもないと思ったので、日常の報告としてこちらに投稿します。よろしくお願いします。
rename.pyを作成
rename.pyをこのように作りました。
import os
# 実行するフォルダのパスを要求
directory = input("Enter the directory path: ")
# 入力されたフォルダが存在するか確認
if not os.path.exists(directory):
print(f"Directory '{directory}' does not exist.")
else:
# フォルダ内の全てのファイルを取得
all_files = os.listdir(directory)
for filename in all_files:
# "<base_filename>_2.pdf"に該当するファイルを検索
if filename.endswith("_2.pdf"):
base_filename = filename[:-6]
check_filename = f"{base_filename}_2.pdf"
new_filename = f"{base_filename}_1.pdf"
# "<base_filename>_1.pdf"が既に存在するか確認
if not os.path.isfile(os.path.join(directory, new_filename)):
# 存在しなかった場合、"<base_filename>.pdf"を"<base_filename>_1.pdf"へ変更
original_filename = f"{base_filename}.pdf"
if os.path.isfile(os.path.join(directory, original_filename)):
os.rename(os.path.join(directory, original_filename),
os.path.join(directory, new_filename))
print(f"Renamed {original_filename} to {new_filename}")
else:
raise FileNotFoundError(
f"{original_filename} does not exist in the directory"
)
input("Press Enter to exit...")
手順をざっくり説明すると、
入力から得たディレクトリのパスに当該ディレクトリが存在するか確認します。
ディレクトリ内の連番になっているファイルのうち、"<base_filename>_1.pdf"がないものを見つけます。
"<base_filename>.pdf"を"<base_filename>_1.pdf"に改名します。
Enterが入力されるまで結果を表示し、ウィンドウを閉じます。
といった具合になっています。
run_rename.batを作成
このままだと、rename.pyを実行する前にcdする必要があり面倒です。また、その都度コマンドプロンプトを立ち上げるのも面倒です。そこで、バッチファイルを作成して、起動をスムーズに行えるようにしました。
@echo off
cd /d "<rename.pyのパス>"
python rename.py
運用
rename.pyを実行したいディレクトリのパスを取得します。
クリックしやすい場所にあるrun_rename.batを起動します。
入力を求められるので、1.で取得したパスを入力します。
結果を確認し、Enterを押して終了します。
まとめ
Python以外でファイル名を操作する方法に疎いため、なんだか回りくどい方法になってしまった感じがありますが、個人的にはosの良い復習になりました。
ファイルが連番になるとき、一番目のときはまさか連番になるとは思っていなかったということは往々にしてあります。皆さんの作業負担を少しでも減らせたら幸いです。