7v.技术分享
← 返回教程库

批量重命名,先生成改名清单

用 Python 规划新文件名,先检查排序、冲突和回退信息。

文件与脚本 · 更新于 2026年10月26日

适用环境
Python 3.10+;以图片副本目录为例

真正容易出错的是规则

一批图片改成 photo_001、photo_002 看起来简单,但排序依据、扩展名和名称冲突都会影响结果。本文先生成计划,不直接改名;这样可以在执行前看清“哪一个原文件对应哪一个新名字”。

准备可回退的试验

先复制几张图片到 rename_demo 文件夹。原件另存,脚本与文件夹放在同一工作目录。目标格式由代码中的 photo_{i:03d} 决定,代表至少三位编号,不是图片的拍摄时间。

生成计划文件

from pathlib import Path
import csv

root = Path('rename_demo')
files = sorted(p for p in root.iterdir() if p.is_file() and not p.is_symlink() and p.suffix.lower() in {'.jpg', '.jpeg', '.png'})
plan = [(p, root / f'photo_{i:03d}{p.suffix.lower()}') for i, p in enumerate(files, 1)]
for old, new in plan:
    if new.exists() and new != old:
        raise FileExistsError(f'名称冲突: {new}')
with Path('rename-plan.csv').open('x', encoding='utf-8-sig', newline='') as stream:
    writer = csv.writer(stream)
    writer.writerow(['原路径', '新路径'])
    for old, new in plan:
        writer.writerow([str(old), str(new)])
        print(old.name, '->', new.name)
print('仅生成清单,未执行重命名')

检查三件事

  1. 打开 rename-plan.csv,确认原路径和新路径一一对应。该文件使用独占创建模式,已存在时会报错,避免覆盖上一次记录。
  2. 确认排序符合预期:脚本按路径名称排序,photo_10 可能排在 photo_2 前面;它没有读取拍摄时间或执行自然排序。
  3. 目标文件已经存在且不是原文件时,脚本会中止。不要通过先删除目标文件来消除报错,应先调整规则。

为什么这一版停在清单

真正执行时,还要考虑改名到一半被打断、大小写不敏感的文件系统、文件被占用以及目标被其他程序新建等情况。稳妥的批量工具会先改为独立临时名,再转成最终名,并保留成功日志和回退映射。先生成清单是一个可以单独复用的技术步骤,不能把“清单生成成功”写成“文件已经改名”。

获取本文源码

官方参考资料

接着探索

下载文件后,用 SHA-256 核对 ↗用 Robocopy 做一次可核对的备份 ↗