直接用pathlib安全批量改后缀:遍历文件、统一转小写比对后缀、检查目标路径是否存在,再调用p.rename();避免winerror 183需防大小写冲突与同名覆盖,必要时加序号或改用shutil.copy2()保留原文件。

直接用 os.rename() 配合 os.listdir() 或 pathlib.Path.iterdir() 就能搞定,但必须注意文件名冲突、路径拼接错误和大小写敏感问题——Windows 下 .TXT 和 .txt 是同一个文件,重命名时可能报错 [WinError 183]。
用 pathlib 安全遍历并重命名文件
pathlib 比 os 更直观,自动处理路径分隔符和相对路径。重点是:只改后缀,不碰文件名主体;跳过目录;避免覆盖同名文件。
- 用
p.suffix获取当前后缀,p.with_suffix('.new')构造新路径(不修改原文件) - 检查目标路径是否存在:
if not new_path.exists():,否则跳过或加序号 - 调用
p.rename(new_path),不是os.rename(str(p), str(new_path))—— 后者容易因编码或空格出错
from pathlib import Path
root = Path("your_dir")
for p in root.iterdir():
if p.is_file() and p.suffix.lower() == ".old":
new_path = p.with_suffix(".new")
if not new_path.exists():
p.rename(new_path)
批量改后缀时如何避免 [WinError 183]
这个错误本质是“无法创建已存在的文件”,常见于:同一目录下有 a.TXT 和 a.txt,都试图改成 a.txt;或大小写不同但系统视为相同(Windows/macOS 默认不区分)。
- 统一转小写再比对:
p.suffix.lower() == ".old",且生成新路径前用new_path.resolve().samefile()排查是否指向自身 - 更稳妥做法:先收集所有待改文件,按
new_path去重,或对冲突目标加数字后缀(如a.txt→a_1.txt) - Linux 下也要小心硬链接——改名不影响链接指向,但原路径失效
需要保留原始文件时,别用 rename() 直接覆盖
如果要求“旧文件留着,只生成新后缀副本”,就得用 shutil.copy2() 而不是 rename(),否则源文件就没了。
-
shutil.copy2(p, new_path)复制并保留 mtime/atime - 复制成功后再删原文件:
p.unlink(),但必须确保复制完成,否则数据丢失 - 建议加异常捕获:
try...except PermissionError:,有些文件可能被其他进程占用
真正麻烦的不是循环和改名,而是路径解析是否跨平台、大小写是否隐性冲突、以及“同名不同后缀”在特定系统下是否算重复——这些细节不提前验证,脚本跑完才发现部分文件没动或者报了一堆错。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











