腳本03:批次資料夾或檔案更名

建議檔名: 批次資料夾或檔案更名.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✅ 全部作業完成。")