博客 / 詳情

返回

Python自動化:一鍵搞定“文件批量重命名”

在日常辦公或整理資料時,你是否遇到過這樣的崩潰時刻:

  • 下載了幾百張素材圖片,名字全是亂碼(如 ad3f12.jpg),想改成有序的 img_001.jpg
  • 要把項目文件夾裏幾十個文件的“副本”字樣全部刪掉?
  • 想給所有備份文件加上今天的日期後綴?

核心工具與準備

不需要安裝任何第三方庫,我們使用Python自帶的 os 模塊即可完成操作。

核心函數

  • os.listdir(path): 獲取指定目錄下的所有文件名。
  • os.rename(src, dst): 將文件從 src(原路徑)重命名為 dst(新路徑)。
  • os.path.join(path, name): 智能拼接路徑,兼容Windows和Mac系統。

💡 場景一:按順序批量編號(整理照片/素材)

需求: 將亂七八糟的文件名統一修改為 前綴_序號.擴展名 的格式,例如 Photo_001.jpg

適用場景: 攝影師整理照片、深度學習數據集預處理、壁紙庫整理。

📜 代碼實現

Python

import os

def batch_rename_sequence(folder_path, prefix="File", start_index=1):
    # 1. 獲取文件夾內所有文件
    try:
        files = os.listdir(folder_path)
    except FileNotFoundError:
        print("❌ 找不到文件夾,請檢查路徑!")
        return

    # 2. 循環處理每一個文件
    # enumerate生成帶索引的序列,i從0開始,所以需要+start_index
    for i, filename in enumerate(files):
        # 排除隱藏文件(如Mac下的.DS_Store)
        if filename.startswith('.'):
            continue

        # 獲取文件後綴名 (例如 .jpg)
        file_ext = os.path.splitext(filename)[1]
        
        # 3. 構建新名字
        # :03d 表示數字補零對齊,例如 1 -> 001, 12 -> 012
        new_name = f"{prefix}_{start_index + i:03d}{file_ext}"
        
        # 4. 拼接完整路徑
        old_path = os.path.join(folder_path, filename)
        new_path = os.path.join(folder_path, new_name)
        
        # 5. 執行重命名
        os.rename(old_path, new_path)
        print(f"✅ [重命名成功]: {filename} -> {new_name}")

# --- 使用示例 ---
# 請將路徑替換為你實際的文件夾路徑
target_folder = r"C:\Users\Admin\Pictures\Travel"
batch_rename_sequence(target_folder, prefix="Travel_Japan", start_index=1)

場景二:關鍵詞替換與清洗(辦公文檔處理)

需求: 刪除文件名中多餘的字符(如“ - 副本”),或者將文件名中的空格替換為下劃線。

適用場景: 處理從網盤批量下載的文件、整理同事發來的命名不規範的文檔。

代碼實現

Python

import os

def batch_replace_keyword(folder_path, target_word, replace_word=""):
    files = os.listdir(folder_path)
    
    count = 0
    for filename in files:
        # 如果文件名中包含目標關鍵詞
        if target_word in filename:
            # 1. 生成新文件名 (字符串替換)
            new_name = filename.replace(target_word, replace_word)
            
            # 2. 拼接路徑
            old_path = os.path.join(folder_path, filename)
            new_path = os.path.join(folder_path, new_name)
            
            # 3. 避免文件名衝突 (如果新名字已經存在,則跳過)
            if os.path.exists(new_path):
                print(f"⚠️ [跳過] 目標文件已存在: {new_name}")
                continue
                
            os.rename(old_path, new_path)
            print(f"🔨 [清洗完成]: {filename} -> {new_name}")
            count += 1
            
    print(f"🎉 總計處理了 {count} 個文件。")

# --- 使用示例 ---
# 場景:把 " - 副本" 刪掉,相當於替換為空字符串
work_dir = r"D:\Work\Reports\2024"
batch_replace_keyword(work_dir, target_word=" - 副本", replace_word="")

場景三:修改文件擴展名(格式轉換後處理)

需求: 批量將所有的 .txt 文件後綴修改為 .md(Markdown格式),或者將 .jpeg 統一為 .jpg

適用場景: 代碼工程遷移、特定軟件格式兼容、日誌文件處理。

代碼實現

Python

import os

def batch_change_extension(folder_path, old_ext, new_ext):
    # 確保擴展名帶點,例如 .txt
    if not old_ext.startswith('.'): old_ext = '.' + old_ext
    if not new_ext.startswith('.'): new_ext = '.' + new_ext
    
    files = os.listdir(folder_path)
    
    for filename in files:
        # 檢查是否以舊後綴結尾
        if filename.endswith(old_ext):
            # 1. 分離文件名和後綴
            base_name = os.path.splitext(filename)[0]
            
            # 2. 組合新名字
            new_name = base_name + new_ext
            
            # 3. 執行重命名
            os.rename(
                os.path.join(folder_path, filename),
                os.path.join(folder_path, new_name)
            )
            print(f"🔄 [格式轉換]: {filename} -> {new_name}")

# --- 使用示例 ---
# 場景:將文件夾內所有 .htm 文件改為 .html
web_dir = r"/var/www/html/project"
batch_change_extension(web_dir, ".htm", ".html")

🛡️ 最佳實踐:如何防止“一鍵火葬場”?

批量重命名一旦出錯,恢復起來非常麻煩(除非你有備份)。強烈建議在執行 os.rename 之前,先增加一個 “演習模式”(Dry Run)

給代碼加上“安全鎖”

我們可以封裝一個更通用的函數,增加一個 dry_run 參數:

Python

import os

def safe_rename(folder_path, dry_run=True):
    files = os.listdir(folder_path)
    print(f"🔍 當前模式: {'演習模式 (不實際修改)' if dry_run else '實戰模式 (謹慎操作)'}")
    print("-" * 40)

    for i, filename in enumerate(files):
        if filename.startswith('.'): continue
        
        # 假設邏輯是:加前綴 "2025_"
        new_name = f"2025_{filename}"
        
        if dry_run:
            # 演習模式:只打印,不執行
            print(f"👁️ [預覽] {filename}  --->  {new_name}")
        else:
            # 實戰模式:真正動手
            old_p = os.path.join(folder_path, filename)
            new_p = os.path.join(folder_path, new_name)
            os.rename(old_p, new_p)
            print(f"✅ [已修改] {filename}  --->  {new_name}")

# --- 使用建議 ---
# 第一步:先設為 True,運行看打印結果是否符合預期
safe_rename(r"D:\TestFiles", dry_run=True)

# 第二步:確認無誤後,改為 False 再次運行
# safe_rename(r"D:\TestFiles", dry_run=False)
user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.