适用环境
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('仅生成清单,未执行重命名')检查三件事
- 打开 rename-plan.csv,确认原路径和新路径一一对应。该文件使用独占创建模式,已存在时会报错,避免覆盖上一次记录。
- 确认排序符合预期:脚本按路径名称排序,photo_10 可能排在 photo_2 前面;它没有读取拍摄时间或执行自然排序。
- 目标文件已经存在且不是原文件时,脚本会中止。不要通过先删除目标文件来消除报错,应先调整规则。
为什么这一版停在清单
真正执行时,还要考虑改名到一半被打断、大小写不敏感的文件系统、文件被占用以及目标被其他程序新建等情况。稳妥的批量工具会先改为独立临时名,再转成最终名,并保留成功日志和回退映射。先生成清单是一个可以单独复用的技术步骤,不能把“清单生成成功”写成“文件已经改名”。