建議檔名: 批次資料夾或檔案更名.py
依據【批次多樣化更名清單】 (以【Tab】分隔的原檔名及新檔名兩欄的純文字檔),將【目標資料夾】中在清單內有列舉的檔案批次變更為需求的新檔名。
重點在於【在清單內】,也就是【目標資料夾】中若有其他不在清單內的檔案是不受影響的,少許檔案看不出效率,不過一次更名一千多個小說檔時真的很暢快。而這種多樣化增添更名方式是【Renamer】工具無法處理的情形。
也可以變更子資料夾的名稱,某些情況下還挺有用的。
程式碼:
(複製以下文字,貼入純文字檔中,存檔後將副檔名設定為 .py)
import os
print("📁 批次更名工具")
# 使用者選擇:更名檔案還是子資料夾
target_type = input("請選擇要更名的項目類型:F = 檔案,S = 子資料夾:").strip().upper()
while target_type not in ('F', 'S'):
target_type = input("請重新輸入 F 或 S:").strip().upper()
# 輸入清單與目標資料夾路徑(可直接按 Enter)
list_path = input("請輸入對應清單.txt 的完整路徑(Enter 代表使用目前資料夾):").strip()
target_folder = input("請輸入目標資料夾路徑(Enter 代表使用目前資料夾):").strip()
if list_path == "":
list_path = os.path.join(os.getcwd(), "清單.txt")
if target_folder == "":
target_folder = os.getcwd()
# 讀取清單內容,支援 tab 或等號分隔
mapping = {}
with open(list_path, encoding="utf-8") as f:
for line in f:
line = line.strip()
if not line or line.startswith("#"):
continue
if "\t" in line:
parts = line.split("\t", 1)
elif "=" in line:
parts = line.split("=", 1)
else:
continue
old, new = parts[0].strip(), parts[1].strip()
if old:
mapping[old] = new
# 取得目前資料夾下所有檔案或子資料夾
if target_type == "F":
items = [f for f in os.listdir(target_folder) if os.path.isfile(os.path.join(target_folder, f))]
else:
items = [f for f in os.listdir(target_folder) if os.path.isdir(os.path.join(target_folder, f))]
# 模擬預覽
renames = []
for name in items:
base, ext = os.path.splitext(name) if target_type == "F" else (name, "")
if base in mapping:
new_name = mapping[base] + ext
renames.append((name, new_name))
print("\n✅ 模擬預覽:即將變更的項目")
print("[原始名稱] → [更名後名稱]")
print("-------------------------------------------------")
if not renames:
print("⚠️ 沒有找到任何符合條件的項目可更名。")
print("⚠️ 無對應項目可進行更名,程式結束。")
exit()
for old, new in renames:
print(f"{old:<25} → {new}")
confirm = input("\n請按 Enter 確認更名,或輸入 N 取消操作:").strip().upper()
if confirm == "N":
print("❌ 操作已取消,未進行任何更名。")
exit()
# 執行更名
log = []
for old, new in renames:
old_path = os.path.join(target_folder, old)
new_path = os.path.join(target_folder, new)
try:
os.rename(old_path, new_path)
log.append(f"✔️ {old} → {new}")
except Exception as e:
log.append(f"❌ {old} → {new}(失敗:{e})")
# 輸出結果 log
print("\n📄 更名結果:")
for entry in log:
print(entry)
print("\n✅ 全部作業完成。")