ファイルリネームアプリを作ってみる
大量のファイルを一括で変換する場合ファイルを一つ一つリネームするのは非常に効率が悪いため、Pythonでリネームアプリを作成してみました。
本記事では、該当のアプリのソースコードや使い方を紹介します。
ファイルリネームアプリサンプルコード
ファイルリネームアプリサンプルコードは以下の通りです。
Tkinterを利用して画面を構築し処理しています。
import tkinter as tk
from tkinter import filedialog, messagebox, scrolledtext
import os
def open_folder():
"""
フォルダ選択ダイアログを表示し、選択されたフォルダのパスをラベルにセットします。
選択されたフォルダ内のファイル一覧をテキストエリアに表示します。
"""
# フォルダ選択ダイアログを開く
folder_selected = filedialog.askdirectory()
# フォルダが選択された場合
if folder_selected:
# ラベルにフォルダパスをセット
label_folder_path.config(text=folder_selected)
# ファイル一覧を更新
update_file_list(folder_selected)
def update_file_list(folder_path):
"""
指定されたフォルダ内のファイル一覧を修正前と変更後のテキストエリアに表示します。
"""
# フォルダ内のファイル一覧を取得
file_list = os.listdir(folder_path)
# 修正前のテキストエリアを編集可能に設定
text_area_original.config(state='normal')
# 既存の内容をクリア
text_area_original.delete('1.0', tk.END)
# 各ファイルの処理
for file in file_list:
# ファイル名を追加
text_area_original.insert(tk.END, file + '\n')
# 修正前のテキストエリアを編集不可に戻す
text_area_original.config(state='disabled')
# 変更後のテキストエリアをクリア
text_area_new.delete('1.0', tk.END)
for file in file_list:
# 同様にファイル名を追加
text_area_new.insert(tk.END, file + '\n')
def clear_all():
"""
フォルダパスとテキストエリアの内容をクリアします。
"""
# フォルダパスの内容をクリア
label_folder_path.config(text="")
# 修正前のテキストエリアの内容をクリア
# 編集可能にしないとクリアできない
text_area_original.config(state='normal')
# 内容をクリア
text_area_original.delete('1.0', tk.END)
# 編集不可に戻す
text_area_original.config(state='disabled')
# 変更後のテキストエリアの内容をクリア
text_area_new.delete('1.0', tk.END)
def rename_files():
"""
テキストエリアに入力された新しいファイル名で一括リネームを実行します。
空のファイル名がある場合はエラーメッセージを表示します。
"""
# 現在選択されているフォルダのパスを取得
folder = label_folder_path.cget("text")
# フォルダが選択されている場合
if folder:
# 修正前のファイル名を取得
original_files = text_area_original.get('1.0', 'end-1c').splitlines()
# 変更後のファイル名を取得
new_files = text_area_new.get('1.0', 'end-1c').splitlines()
# ファイル名の数が一致しない場合、エラーメッセージを表示
if len(original_files) != len(new_files):
messagebox.showerror("エラー", "修正前と変更後のファイル数が一致しません。")
return
# 空の新しいファイル名がある場合、エラーメッセージを表示
if any(not new_name.strip() for new_name in new_files):
messagebox.showerror("エラー", "空のファイル名が存在します。")
return
for original_name, new_name in zip(original_files, new_files):
# ファイル名が変更されている場合
if original_name != new_name:
# 元のファイルパス
original_path = os.path.join(folder, original_name)
# 新しいファイルパス
new_path = os.path.join(folder, new_name)
try:
# リネームを実行
os.rename(original_path, new_path)
except Exception as e:
messagebox.showerror("エラー", f"'{original_name}' のリネーム中にエラーが発生しました: {e}")
return
# 成功メッセージを表示
messagebox.showinfo("成功", "ファイルのリネームが完了しました。")
# ファイル一覧を更新
update_file_list(folder)
else:
# フォルダ未選択の警告を表示
messagebox.showwarning("警告", "フォルダが選択されていません")
def close_app():
"""
アプリケーションを終了します。
"""
# tkinterのルートウィンドウを閉じる
root.destroy()
#####################################################
# GUIの設定
root = tk.Tk() # メインウィンドウを作成
root.title("ファイル一括リネームツール") # タイトル設定
# トップフレームの設定
frame_top = tk.Frame(root)
frame_top.pack(padx=10, pady=5, fill=tk.X)
# ファイル一覧表示のフレーム設定
frame_files = tk.Frame(root)
frame_files.pack(padx=10, pady=5, fill=tk.BOTH, expand=True)
# ボトムフレームの設定
frame_bottom = tk.Frame(root)
frame_bottom.pack(padx=10, pady=5, fill=tk.X)
# フォルダパスラベル
label_folder_path = tk.Label(frame_top, text="", width=100, bg='#ffffe0', anchor='w')
label_folder_path.pack(side=tk.LEFT, fill=tk.X)
# フォルダ選択ボタン
button_select_folder = tk.Button(frame_top, text="フォルダ選択", width=10, command=open_folder)
button_select_folder.pack(side=tk.LEFT, padx=5)
# 修正前ファイル名のサブフレーム
frame_original = tk.Frame(frame_files)
frame_original.pack(side=tk.LEFT, fill=tk.BOTH, expand=True)
label_original = tk.Label(frame_original, text="修正前ファイル名", anchor='w')
label_original.pack(side=tk.TOP, fill=tk.X)
# 修正前ファイル名一覧
text_area_original = scrolledtext.ScrolledText(frame_original, width=70, height=15, state='disabled', bg='#ffffe0')
text_area_original.pack(side=tk.BOTTOM, fill=tk.BOTH, expand=True)
# 変更後ファイル名のサブフレーム
frame_new = tk.Frame(frame_files)
frame_new.pack(side=tk.LEFT, fill=tk.BOTH, expand=True)
label_new = tk.Label(frame_new, text="変更後ファイル名", anchor='w')
label_new.pack(side=tk.TOP, fill=tk.X)
# 変更後ファイル名一覧
text_area_new = scrolledtext.ScrolledText(frame_new, width=70, height=15)
text_area_new.pack(side=tk.BOTTOM, fill=tk.BOTH, expand=True)
# 終了ボタン
button_close = tk.Button(frame_bottom, text="終了", width=10, command=close_app)
button_close.pack(side=tk.RIGHT, padx=5)
# クリアボタン
button_clear = tk.Button(frame_bottom, text="クリア", width=10, command=clear_all)
button_clear.pack(side=tk.RIGHT, padx=5)
# 一括リネームボタン
button_rename = tk.Button(frame_bottom, text="一括リネーム", width=10, command=rename_files)
button_rename.pack(side=tk.RIGHT, padx=5)
root.mainloop()
実行結果
初期画面として以下の簡単な画面が出ます。
フォルダ選択ボタンからフォルダを選択して実行するとフォルダ内のファイルが一覧表示されます。
メモ帳などでファイル名変更して変更後ファイル名のテキストエリアに貼り付けし【一括リネーム】ボタンを押下します。
ファイルが一括で変換されます。
注意事項
以下のようなエラーが出る場合があります。
これは修正前ファイル名と修正後ファイル名の数があっていない場合に発生します。
矢印のように、改行が入っている場合だけでも1つのファイルとしてみなされるので注意して下さい。
最後に
以上がファイルリネームアプリのサンプルコードと使い方です。
exe化したい場合には以下コマンドを入力することで実行ファイル作成ができます。
※筆者はrename.pyという名前でファイル作成しています。
pyinstaller rename.py --onefile --noconsole
一括でファイル名変更の作業が必要となった場合には利用してみてはいかがでしょうか。
コメント