Excel映射表批量重命名文件:一份对照表搞定几百个乱名字

场景:老板发来一份 Excel,A列是旧文件名、B列是规范后的新文件名,让你把文件夹里几百个"报告_旧版1.docx、名单(3)(最终).xlsx"批量改成规范名字。手动改到手抽筋,这篇给你一个实测可用的脚本。

思路

  1. 读 Excel 两列(openpyxl),得到「旧名 → 新名」映射;
  2. 逐条检查:旧文件在不在?新文件会不会撞名?
  3. 执行重命名,同时写一份 CSV 日志——日志就是撤销凭证。

脚本(保存为 rename_by_excel.py)

#!/usr/bin/env python3
# 用法: python3 rename_by_excel.py map.xlsx ./docs [--dry-run]
import csv, os, sys, argparse

def read_map(xlsx):
    import openpyxl
    wb = openpyxl.load_workbook(xlsx, read_only=True)
    ws = wb.active
    rows = [(str(r[0]).strip(), str(r[1]).strip())
            for r in ws.iter_rows(values_only=True)
            if r and len(r) > 1 and r[0] and r[1]]
    wb.close()
    if rows and any(k in rows[0][0] for k in ("旧","原","old")):
        rows = rows[1:]   # 跳过表头
    return rows

ap = argparse.ArgumentParser()
ap.add_argument("xlsx"); ap.add_argument("folder")
ap.add_argument("--dry-run", action="store_true")
a = ap.parse_args()

rows = read_map(a.xlsx)
seen, log = set(), []
for old, new in rows:
    if old in seen:
        log.append((old, new, "duplicate_skipped")); continue
    seen.add(old)
    src = os.path.join(a.folder, old)
    if not os.path.exists(src):
        log.append((old, new, "missing")); continue
    dst = os.path.join(a.folder, new)
    n = 1; base, ext = os.path.splitext(new)
    while os.path.exists(dst):                 # 撞名自动加序号,绝不覆盖
        dst = os.path.join(a.folder, f"{base}({n}){ext}"); n += 1
    if not a.dry_run: os.rename(src, dst)
    log.append((old, os.path.basename(dst), "renamed"))

with open("rename_log.csv", "w", newline="", encoding="utf-8-sig") as f:
    w = csv.writer(f); w.writerow(["旧文件名","实际新文件名","结果"]); w.writerows(log)
print("完成,明细见 rename_log.csv(交换两列再跑一遍即可撤销)")

实测结果(不是纸上谈兵)

我在本机构造了真实测试用例,包括三种最容易翻车的边界情况:

测试场景脚本行为结果
3 个正常改名全部成功✅ 报告_旧版1.docx → 2026Q3_财务报告.docx 等
映射表里写了不存在的旧文件记入 missing,不报错不中断✅ 其余文件照常处理
同一旧文件名出现两次只执行第一次,第二次标记 duplicate✅ 防止二次改名把文件改乱
新文件名已存在(撞名)自动加 (1) 序号,绝不覆盖✅ 员工名册_10月(1).xlsx,原文件完好
--dry-run 预演只打印不改动✅ 先看效果再动手

四个坑(都踩过)

  1. 永远先 --dry-run。对照表里一个多余的空格,"找不到文件"还好;要是新名字写错导致覆盖,就找不回来了。
  2. 新文件名撞名必须自动加序号,直接 os.rename 会静默覆盖同名文件——数据无价。
  3. 日志要可逆:rename_log.csv 交换两列再跑一遍脚本就能撤销,这比任何"回收站"都可靠。
  4. 中文文件名注意编码:Excel 读出来可能是 "报告_旧版1.docx "(带尾巴空格),所以脚本里 strip() 不能省。
🛠️ 懒得自己跑?喵窝资源铺可以代做:发我你的对照表和文件,19.9 元帮你批量处理完交付。也可以看看密封版工具清单。

← 返回全部文章 | 2026-10-06