『黄昏の宣告者』はCSVファイルの内容に従って、指定フォルダ内のファイル名を一括で変更するツールです。
>>GUI外観 >>使い方以下は『黄昏の宣告者』のソースコード全文です:
import os
import csv
import tkinter as tk
from tkinter import filedialog, messagebox, scrolledtext
def select_folder():
folder = filedialog.askdirectory()
if folder:
folder_var.set(folder)
def select_csv():
file_path = filedialog.askopenfilename(filetypes=[("CSV Files", "*.csv")])
if file_path:
csv_var.set(file_path)
def clear_log():
log_text.config(state='normal')
log_text.delete(1.0, tk.END)
log_text.config(state='disabled')
def log(message):
log_text.config(state='normal')
log_text.insert(tk.END, message + '\n')
log_text.see(tk.END)
log_text.config(state='disabled')
def rename_files():
folder = folder_var.get()
csv_path = csv_var.get()
clear_log()
if not os.path.isdir(folder):
messagebox.showerror("エラー", "有効なフォルダを選択してください。")
return
if not os.path.isfile(csv_path):
messagebox.showerror("エラー", "有効なCSVファイルを選択してください。")
return
try:
with open(csv_path, newline='', encoding='utf-8') as csvfile:
reader = csv.reader(csvfile)
count = 0
for row in reader:
if len(row) < 2:
log(f"スキップ: 列数が不足しています → {row}")
continue
old_name = row[0].strip()
new_name = row[1].strip()
if not old_name or not new_name:
log(f"スキップ: 不正なデータ → {row}")
continue
old_path = os.path.join(folder, old_name)
new_path = os.path.join(folder, new_name)
if os.path.exists(old_path):
os.rename(old_path, new_path)
log(f"{old_name} → {new_name} に変更しました")
count += 1
else:
log(f"{old_name} は存在しません")
log("---")
log(f"以上、{count} 件のファイル名を変更しました。")
messagebox.showinfo("完了", f"{count} 件のファイル名を変更しました。")
except Exception as e:
messagebox.showerror("エラー", f"リネーム中にエラーが発生しました:\n{str(e)}")
# GUIの作成
root = tk.Tk()
root.title("ファイル名一括リネームツール - 黄昏の宣告者")
##タイトルバーアイコン表示用
data = '''R0lGODdhEAAQAIYAAP///////v7+/f79/P38+/v6+fj39vb19PX18/Dw7+/u7erp6Ono5+jn5ubl5OXl5OPj4t3d3Nzc29bW1dXU09PT0tLS0dLR0MvLysjHx8TEw8TDw8PDw8LCwcHBwMC/v76+vby8u7u6urq6ubi4t7e3tra1tbS0s7OzsrKysbKxsbCwsLCvr6+vr6+vrq+urq6uraysq6uqqqqqqqqpqampqaiop6enpqampqSkpKSjo6GhoaCgoKCfn5+fnp6enp6dnZ2dnZ2cnJubmpmZmZmZmJaWlZWVlZSUlJKSkpKRkZCQkI+Pj46Ojo2NjYyMjIqKiomJiYeHh4aGhoWFhYSEhISEg4ODg4KCgoGBgYCAgH9/f35+fn19fXx8fHt8fHt7e3p6e3p6enl5eXh4eHd3d3Z3d3V2dnV1dXR1dXFxcXBwcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACwAAAAAEAAQAEAI1wCxCBwoMAuXLVUSCrziBYUMNCYoOLmywwSULFcGXtkyg4SGHGtcADBgoECCKFoWamFSogoTH2Ba/OiSkeCVK2O2gIEhQAEGDB6qZFkY4wiGDxWGjKGS8MpQLFe4AIHQQUqKEUSU6PBS0yYXLjxoVOFKsKwVp1OQNAkjBozNL2Jc/CijYsABAgEQoITqZcGGMzUmgGjg4AGDCFOyVBlzQUKMJ2RovBDiZUvZKmZ6cLAQAqWQDDfAdMVSBcySImmM2FCTBAdZm1uSrDghgkUQy2U1MhSDsWxAADs='''
root.tk.call('wm', 'iconphoto', root._w, tk.PhotoImage(data=data))
####
folder_var = tk.StringVar()
csv_var = tk.StringVar()
tk.Label(root, text="フォルダ選択").pack()
tk.Entry(root, textvariable=folder_var, width=60).pack(padx=5, pady=2)
tk.Button(root, text="フォルダを選択", command=select_folder).pack(pady=2)
tk.Label(root, text="CSVファイル選択").pack()
tk.Entry(root, textvariable=csv_var, width=60).pack(padx=5, pady=2)
tk.Button(root, text="CSVを選択", command=select_csv).pack(pady=2)
tk.Button(root, text="リネーム実行", command=rename_files).pack(pady=10)
# ステータスログ表示エリア
tk.Label(root, text="ステータス").pack()
log_text = scrolledtext.ScrolledText(root, width=70, height=15, state='disabled', wrap='word')
log_text.pack(padx=5, pady=5)
root.mainloop()