文件名里全是空格和"(1)(2)"?一个脚本批量改名,还能先预览再动手

2026-10-06 · 本文所有代码均在真实测试数据上跑通后发布

从微信/网盘批量下载的文件,文件名经常是照片 最终 (1).txt这种:空格、括号、重复后缀混在一起,传到别人电脑或脚本里全是坑。手动一个个改太累。本文给一个带"预览模式"的批量重命名脚本——先看清单,确认无误再真改。

测试数据(真实跑过,故意埋了3个坑)

脚本

import os, glob, re

SRC = "demo"        # 要扫描的目录
APPLY = False       # 先 False 预览,确认后改 True 真执行

changes = []
for f in sorted(glob.glob(os.path.join(SRC, "*"))):
    d, b = os.path.split(f)
    nb = b.replace(" ", "_")                       # 空格→下划线
    nb = re.sub(r"\((\d+)\)", r"_\1", nb)          # (1) → _1
    nb = re.sub(r"_+", "_", nb)                    # 连续下划线合并
    if nb != b:
        target = os.path.join(d, nb)
        if os.path.exists(target):
            print(f"[跳过] 目标已存在: {nb}")       # 坑1:别覆盖别人文件
            continue
        changes.append((f, target))

for old, new in changes:
    print(f"{'改名' if APPLY else '预览'}: {os.path.basename(old)} -> {os.path.basename(new)}")
    if APPLY:
        os.rename(old, new)
print(f"共 {len(changes)} 个文件待改")

实测结果

预览: 照片 最终 (1).txt -> 照片_最终_1.txt
预览: 照片 最终.txt -> 照片_最终.txt
共 2 个文件待改        # 报告_v1.txt 没被动,正确

把 APPLY 改成 True 再跑一次,os.listdir 确认目录里变成 照片_最终.txt / 照片_最终_1.txt / 报告_v1.txt,与预览一致。

三个坑(都是真实踩到/防住的)

  1. 目标名已存在:比如已有 照片_最终.txt,直接 os.rename 在 Windows 会抛错、在 Linux 会静默覆盖——脚本里先 exists 检查并跳过,防止丢文件。
  2. 连续下划线:"照片 (1) 副本" 这种改名后会出现 照片__1_副本,用一次 re.sub(r"_+","_") 收尾。
  3. 没有预览直接改:批量 rename 是不可逆操作(改名不带回收站)。先 APPLY=False 看清单,这是最便宜的安全带。

想改更多规则?

把 nb = ... 那几行换成你自己的正则即可:去日期前缀、统一小写、序号补零都一样套路。如果你的场景更复杂(几千个文件、多级目录、要按 Excel 对照表改名),可以在资源清单页找我定制脚本。