用 Python Tkinter 写了个 高颜值 批量文件重命名工具,核心是这套安全重命名算法
前言
平时整理下载文件夹、相机照片、项目文档,最烦的就是文件名乱糟糟:photo (1).jpg、新建文档 2.docx、IMG_20240801_235959.jpg……
市面上批量重命名工具不少,但要么界面老得像是上个时代的产品,要么一堆付费弹窗。于是我用 Python 标准库(Tkinter)手搓了一个:零第三方依赖、现代 UI、规则灵活,最关键的是——重命名永远不会把文件搞丢。已开源,文末有仓库地址。
界面长这样
左右分栏:左边实时预览原文件名 → 新文件名,右边管理重命名规则,底部一键执行。配色走紫罗兰 + 青色的现代路线(参考了 WorkBuddy 一类的质感)。
功能一览
| 功能 | 说明 |
|---|---|
| 文件类型过滤 | 图片 / 文档 / 视频 / 音频 / 压缩包一键筛选 |
| 8 种重命名规则 | 查找替换、加前缀、加后缀、序号编号、删除区间、改扩展名、正则替换、大小写转换 |
| 规则组合 | 多条规则按顺序依次执行,可增删改、上下移 |
| 规则导入导出 | 规则集存成 JSON,下次直接复用 |
| 预览 + 冲突检测 | 执行前先看效果,自动标出目标名冲突 |
| 一键撤销 | 重命名错了?点一下全部恢复 |
技术亮点:安全重命名(这一步最容易翻车)
批量重命名的最大风险不是规则写错,而是重命名过程本身。最经典的坑:
- 互换改名:想把
a.txt改成b.txt、b.txt改成a.txt。如果按顺序一个接一个改,第二次就撞名了; - 连环改名:
a → b、b → c,顺序不对就失败; - 改名改到一半程序崩溃,文件名停在中间状态。
我的方案是临时名两步法(代码在br4.py的execute_rename/_safe_rename):
第一步:所有文件 → 临时名(UUID 前缀,形如 .br_tmp_xxxx_原文件名) 第二步:所有临时名 → 目标名这样做的好处:
- 任何时刻文件名互不冲突——临时名用的是 UUID,几乎不可能撞名,原目标名也被腾空了;
- 执行前把「原文件名 → 目标名」的映射存在内存里,某一步失败就逆序回滚(
_rollback_temps),文件不会停留在半改名状态; - 撤销(
undo_rename)就是反向执行一遍映射表,简单可靠。
此外还有两道校验:
- Windows 非法字符:
< > : " / \ | ? *和 1-31 控制字符,改名后直接进不去系统,必须提前拦; - Windows 保留名:
CON、PRN、AUX、NUL、COM1~9、LPT1~9——这些名字在 Windows 里是设备名,你永远创建不出一个叫CON.txt的文件,代码里提前给出警告。
规则引擎怎么设计
每条规则就是一个(规则类型, 参数字典)元组,按列表顺序执行,_apply_single_rule里用 if-elif 分发:
forrule_type,paramsinself.rules:ifrule_type=="regex":name=re.sub(params["pattern"],params["new"],name)elifrule_type=="prefix":name=params["text"]+name# ...规则可以导出成 JSON(export_rules/import_rules),比如照片加水印式编号这套规则存下来,下次换个文件夹直接用。
扩展新规则也很容易:在RuleDialog里加一个类型 + 参数表单,在_apply_single_rule里加一个分支就完事。
怎么用
源码直接跑(只用 Python 标准库,无任何第三方依赖):
python br4.py打包成单文件 exe(PyInstaller):
pipinstallpyinstaller pyinstaller br4.spec产物就是dist/br4.exe,双击即用。
开源地址
- 仓库:https://gitcode.com/2402_84199450/Batch_Rename
- 协议:MIT
- 代码里还保留了
br1.py~br3.py的完整演进历史,从 4 月最初版到现在的重构版,想看一个工具怎么一步步长成这样的可以翻翻。
如果觉得有用,欢迎 Star 支持,也欢迎提 Issue 交流新规则的想法 😄