导读:本期聚焦于高永康创作的《Python中怎样重命名文件?os.rename与pathlib.rename的详细用法与常见坑》,敬请观看详情。重命名文件看似简单,实际操作中却经常遇到目标文件已存在、跨盘符移动失败、路径含中文乱码等问题。本文围绕Python中两种主流的重命名方式展开:一种是基于os模块的rename方法,适合快速处理简单场景;另一种是基于pathlib的Path对象写法,代码更优雅且跨平台表现更稳定。文中详细讲解了两种方法的基本用法、批量重命名的实现思路、重名文件的处理策略,以及Windows和Linux下的行为差异,还给出了带异常捕获的健壮写法,帮助你避开开发中容易踩的那些坑。

在Python中重命名文件是一个高频操作,无论是整理下载目录、处理批量生成的报表,还是清洗训练数据集,都绕不开这一步。最直接的做法是调用os模块的rename函数,但如果涉及跨平台、批量处理或者文件名冲突,就需要更细致的处理。本文从基础用法讲到进阶场景,帮你把重命名这件事彻底搞明白。

Python中怎样重命名文件?os.rename与pathlib.rename的详细用法与常见坑

一、使用os.rename重命名文件

os.rename是Python内置os模块提供的函数,也是最经典的文件重命名方式。它的签名非常简单,接收两个参数:第一个是原路径,第二个是目标路径。如果两个路径在同一个目录下,效果就是单纯的重命名;如果目标路径在不同目录,它同时起到移动文件的作用。

需要注意的一点是,在Windows系统上,如果目标文件已经存在,os.rename会直接抛出FileExistsError,覆盖不会静默发生。而在Linux上,行为则相反,目标文件存在时会被直接覆盖,不会有任何提示。这种平台差异是很多跨平台脚本出现"文件莫名消失"问题的根源,写代码时一定要留意。

import os

# 单个文件重命名
os.rename('old_name.txt', 'new_name.txt')

# 重命名的同时移动到其他目录
os.rename(r'C:\data\report.csv', r'C:\backup\report_2024.csv')

# 带异常处理的健壮写法
try:
    os.rename('data.txt', 'data_backup.txt')
except FileNotFoundError:
    print('原文件不存在,请检查路径')
except FileExistsError:
    print('目标文件已存在,Windows下会触发此异常')
except PermissionError:
    print('文件被占用,可能正被其他程序打开')

如果确实需要覆盖已存在的目标文件,Python 3.3之后可以使用os.replace,它在所有平台上都会静默覆盖目标文件,行为完全一致,适合需要确定性结果的场景。

import os

# 无论Windows还是Linux,目标存在时一律覆盖
os.replace('data.txt', 'data_backup.txt')

二、使用pathlib以面向对象方式重命名

pathlib是Python 3.4引入的路径处理模块,也是目前官方更推荐的方式。它把路径封装成Path对象,重命名时调用对象的rename方法即可。相比os.rename,pathlib的优势在于路径拼接更直观,处理带空格、中文的路径时也不容易出错,因为不需要手动拼接字符串。

Path对象的rename方法行为与os.rename基本一致,同样存在Windows抛异常、Linux覆盖的平台差异。如果希望跨平台统一为覆盖语义,可以调用replace方法。此外,pathlib在批量处理场景下配合glob方法使用,代码可读性明显优于os模块。

from pathlib import Path

# 基本用法
p = Path('old_name.txt')
p.rename('new_name.txt')

# 覆盖语义的重命名
p = Path('data.txt')
p.replace('data_backup.txt')

# 配合glob批量重命名:给所有jpg文件加上前缀
folder = Path(r'C:\photos')
for img in folder.glob('*.jpg'):
    img.rename(img.with_name('travel_' + img.name))

上面代码中的with_name方法非常实用,它返回一个只替换文件名、目录部分保持不变的新Path对象,避免了手动拆分路径字符串的麻烦,是批量重命名时的常用技巧。

三、批量重命名的实战技巧

批量重命名最典型的需求是给一组文件按序号编号,比如把照片整理成photo_001.jpg到photo_100.jpg的形式。实现思路是先列出目录下所有符合条件的文件,排序后依次调用重命名。这里有一个容易被忽略的细节:如果新文件名与目录中已有文件名可能冲突,最好先统一改成临时名称,再改成最终名称,否则中途就可能发生覆盖。

from pathlib import Path

folder = Path(r'C:\photos')
files = sorted(folder.glob('IMG_*.jpg'))

# 第一步:改成临时名称,避免中途冲突
for i, f in enumerate(files):
    f.rename(f.with_name(f'tmp_{i}.jpg'))

# 第二步:改成最终的目标名称
for i in range(len(files)):
    src = folder / f'tmp_{i}.jpg'
    src.rename(folder / f'photo_{i:03d}.jpg')

另一个常见需求是提取文件名中的特定部分做替换,例如把所有带空格的文件名中的空格替换成下划线。处理这类需求时,建议在循环里加一层判断,用exists方法预先检测目标文件是否存在,存在则跳过或者追加序号,避免数据丢失。同时务必注意编码问题:在Windows上遇到文件名乱码时,确保脚本文件本身以UTF-8编码保存,并在读取路径时使用原始字符串或者正斜杠,防止反斜杠被误认为转义字符,例如写成r'C:\Users\test\文档'这样的形式。

四、常见问题与注意事项

除了前文提到的平台差异,还有几个坑值得单独说明。第一,跨盘符或跨文件系统重命名时,os.rename在某些老旧系统上可能失败,此时可以改用shutil.move,它会在必要时退化成复制加删除的操作。第二,重命名正在被其他程序占用的文件(例如Excel打开中的xlsx文件)会在Windows上触发PermissionError,脚本最好捕获该异常并给出明确提示,而不是让程序直接崩溃。

第三,路径拼接时不要用加号硬拼字符串,斜杠方向搞错是新手最常见的错误之一。使用pathlib的除法运算符或者os.path.join可以彻底规避这类问题。最后建议在正式批量执行前,先用print输出所有原路径和目标路径,人工确认一遍无误后再执行重命名操作,这一步简单的检查能省去很多恢复数据的麻烦。

import shutil

# 跨盘符移动并重命名,rename失败时的替代方案
shutil.move(r'C:\data\big_file.zip', r'D:\archive\big_file_v2.zip')

# 演练模式:先打印,确认无误后再执行
from pathlib import Path
folder = Path(r'C:\logs')
pairs = [(f, f.with_name(f.stem + '.bak')) for f in folder.glob('*.log')]
for src, dst in pairs:
    print(f'{src} -> {dst}')
# 确认无误后取消下面这行的注释
# for src, dst in pairs: src.rename(dst)

总结一下,单个文件简单重命名用os.rename或Path.rename都很方便;需要覆盖语义就选os.replace或Path.replace;批量处理推荐pathlib配合glob,跨盘符场景交给shutil.move。掌握这些方法后,日常开发中绝大多数文件重命名需求都能从容应对。

Python重命名文件os.renamepathlib修改时间:2026-09-07 10:08:41

免责声明:已尽一切努力确保本网站所含信息的准确性。网站作品多为原创整理与精心创作,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们进行处理Email:chomcom@qq.com。
引用或转载本作品时,请注明当前出处:https://www.ipipp.com/html/20260907/52136.html,基于非商业用途的前提下,欢迎转载或二创本作品。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。