文件名里全是空格和"(1)(2)"?一个脚本批量改名,还能先预览再动手
从微信/网盘批量下载的文件,文件名经常是照片 最终 (1).txt这种:空格、括号、重复后缀混在一起,传到别人电脑或脚本里全是坑。手动一个个改太累。本文给一个带"预览模式"的批量重命名脚本——先看清单,确认无误再真改。
测试数据(真实跑过,故意埋了3个坑)
照片 最终.txt:空格 → 应变照片_最终.txt照片 最终 (1).txt:空格 + 网盘重复后缀 → 应变照片_最终_1.txt报告_v1.txt:没有空格和括号,不应被改动(验证脚本不乱动干净文件)
脚本
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,与预览一致。
三个坑(都是真实踩到/防住的)
- 目标名已存在:比如已有
照片_最终.txt,直接 os.rename 在 Windows 会抛错、在 Linux 会静默覆盖——脚本里先 exists 检查并跳过,防止丢文件。 - 连续下划线:"照片 (1) 副本" 这种改名后会出现
照片__1_副本,用一次re.sub(r"_+","_")收尾。 - 没有预览直接改:批量 rename 是不可逆操作(改名不带回收站)。先
APPLY=False看清单,这是最便宜的安全带。
想改更多规则?
把 nb = ... 那几行换成你自己的正则即可:去日期前缀、统一小写、序号补零都一样套路。如果你的场景更复杂(几千个文件、多级目录、要按 Excel 对照表改名),可以在资源清单页找我定制脚本。