os.rename()是最稳妥直接的文件重命名方法,需用os.path.split()分离路径、os.path.splitext()获取真实后缀、os.path.join()拼全路径,并注意大小写判断与权限问题。

用 os.rename() 逐个重命名最稳妥
直接改文件名里的点号后部分,不碰内容、不依赖外部工具,兼容所有系统。关键在于分离路径、名称、旧后缀,再拼新后缀。
常见错误是没处理完整路径导致文件“消失”——os.rename() 移动到当前目录外必须带全路径;还有忽略大小写,比如把 .JPG 当成 .jpg 漏改。
- 用
os.path.split()拆出目录和文件名,避免手动切字符串出错 - 用
os.path.splitext()获取真实扩展名(它只切最后一个点,report.v1.2.txt→('report.v1.2', '.txt')) - 新文件名必须用
os.path.join()拼路径,否则容易跨目录乱写 - 加
if old_ext.lower() == '.old'判断,避免大小写漏匹配
用 pathlib 写法更简洁但要注意 Python 版本
pathlib 在 Python 3.4+ 原生支持,操作路径像面向对象一样自然,但老项目若还在用 3.3 或更早,会直接报 ModuleNotFoundError。
它默认不覆盖同名文件,target.rename() 遇到目标已存在会抛 FileExistsError,这点比 os.rename() 更严格。
-
Path('a.log').with_suffix('.txt')直接生成新路径对象,不修改原文件 - 必须显式调用
.rename()才真正改名,别忘了这一步 - 批量处理时建议先
list(p.glob('*.log'))收集,再遍历,避免边迭代边改名引发异常 - Windows 下对长路径或特殊字符支持略好于
os模块
遇到 PermissionError 或 “文件正被占用” 怎么办
不是代码写错了,而是系统级限制:Windows 下如果文件被记事本、IDE、杀毒软件甚至资源管理器预览窗格打开,rename() 就会失败,报 PermissionError: [WinError 32]。
- 关掉所有可能访问该文件的程序,尤其是编辑器里的未保存标签页
- 用任务管理器查
explorer.exe是否卡住,重启它有时能释放预览锁 - 临时关闭实时防护(如 Windows Defender 的“实时保护”),改完再开
- 加简单重试逻辑:
time.sleep(0.1)后再试 1–2 次,别死循环
要不要用 glob 还是 os.listdir()
glob 支持通配符(如 '*.pyc'),语义清晰;os.listdir() 只返回文件名列表,得自己 os.path.join() + os.path.isfile() 过滤,多两行但控制更细。
注意 glob.glob('*.log') 不递归子目录,要递归得用 glob.glob('**/*.log', recursive=True),但此时返回的是相对路径,需用 Path().resolve() 补全,否则 rename() 会出错。
- 单层目录、模式固定,优先用
glob - 需要按大小/时间筛选,或排除某些子目录,
os.walk()更合适 - Linux/macOS 下注意 shell 通配符是否已被提前展开(比如在命令行里用
python rename.py *.txt),应让脚本自己扫描
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











