必须检查路径和编码:windows需用os.path.join()拼接路径并启用长路径支持,中文路径要声明utf-8编码、优先用pathlib.path;执行前须打印预览、验证存在性并防覆盖。

用 os.rename() 批量重命名前必须检查路径和编码
直接循环调用 os.rename() 改名最常见,但容易因路径拼错、中文乱码或权限问题批量失败。Windows 下路径分隔符要用 os.path.join(),别硬写 "\" 或 "/";Linux/macOS 也要注意当前工作目录是否为图片所在目录——建议显式用 os.chdir() 切进去,或所有路径都用绝对路径。
常见错误现象:FileNotFoundError: [WinError 2] 系统找不到指定的文件,往往是因为旧文件名没加路径,只传了纯文件名;UnicodeEncodeError 多出现在 Windows 控制台默认 GBK 编码时处理含中文的路径,此时应确保 Python 脚本开头声明 # -*- coding: utf-8 -*-,且用 pathlib.Path 替代字符串拼接更稳妥。
- 先用
glob.glob("*.jpg")或list(pathlib.Path(".").glob("*.JPG"))获取文件列表,注意大小写(Linux 区分,Windows 不区分) - 对每个文件,用
pathlib.Path(old_path).with_name(new_name).with_suffix(".png")构造新路径,比字符串替换更安全 - 执行前务必先打印 2–3 个
old → new示例,确认格式无误再真正 rename
按序号/时间戳重命名时如何避免覆盖与错位
用 for i, f in enumerate(files) 加序号看似简单,但若原始文件顺序不符合预期(比如系统排序是 IMG_1.jpg, IMG_10.jpg, IMG_2.jpg),直接枚举会导致重命名后逻辑错乱。正确做法是先用 sorted() 显式排序,必要时用 natsort.natsorted()(需 pip install natsort)做自然排序。
扩展名统一转换也容易踩坑:os.path.splitext("a.JPG")[0] 得到 "a" 没问题,但若原文件是 "b.tar.gz",splitext() 只切掉最后一个 ".gz",不是你想要的。对多点扩展名,优先用 pathlib.Path(f).stem(返回不含最后扩展名的部分)和 .suffix(只取最后一段扩展名)。
- 想按修改时间排序重命名?用
sorted(files, key=lambda x: os.stat(x).st_mtime) - 新文件名含序号时,用
f"{i+1:04d}"补零,避免生成1.png,10.png,2.png这种非字典序 - rename 前加
if not new_path.exists():判断,防止同名覆盖(尤其跨目录移动时)
用 PIL/Pillow 批量改扩展名并验证图像有效性
单纯改后缀不等于格式转换。如果要把 .bmp 文件改成 .jpg 并确保能正常打开,必须用 Pillow 重新保存——否则只是“骗”操作系统换了个后缀,实际内容还是 BMP 格式,很多工具会打不开。
性能影响明显:逐张 Image.open().save() 比纯文件系统 rename 慢 10–100 倍,数千张图可能耗时几分钟。可加 try/except 跳过损坏图片,用 Image.open(f).verify() 预检(注意 verify 不保证能 save,仍需 try)。
- 代码片段:
from PIL import Image<br>for f in image_files:<br> try:<br> im = Image.open(f)<br> new_path = pathlib.Path(f).with_suffix(".webp")<br> im.convert("RGB").save(new_path, "WEBP", quality=85)<br> except Exception as e:<br> print(f"跳过 {f}:{e}") - 注意
convert("RGB")是保存为 JPEG/WebP 的前提,RGBA 图要先转,否则报cannot write mode RGBA as JPEG - WebP、AVIF 等新格式需 Pillow ≥ 9.1.0,旧版本不支持,运行前检查
pil.__version__
Windows 下长路径和特殊字符导致 rename 失败怎么办
Windows 默认路径长度限制 260 字符,当原始目录嵌套深、文件名本身长,再拼上新名,很容易超限。错误信息通常是 OSError: [WinError 206] 文件名或扩展名太长。另外,文件名含 : " / | ? * 或尾部空格/点,也会被系统拒绝。
解决方法不是“绕开”,而是提前清理:用正则把非法字符替换成下划线,用 pathlib.Path.name 截断过长部分(保留后缀),再启用 Windows 长路径支持(需管理员改注册表或组策略,或用 Python 3.8+ 的 os.replace() 自动处理)。
- 清理非法字符:
re.sub(r'[:"/\|?* -]', "_", name) - 限制总长度:
max_len = 200; stem = stem[:max_len - len(suffix) - 1] - 启用长路径(一次性):以管理员身份运行
cmd,执行reg add HKLMSYSTEMCurrentControlSetControlFileSystem /v LongPathsEnabled /t REG_DWORD /d 1 /f
实际跑通的关键不在语法多炫,而在每一步都先做小样本验证、留好原始文件备份、并在 rename 前把所有路径变量全 print 出来——几千张图出错一次,手动恢复成本远高于多花两分钟检查。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











