在Python中重命名文件是一个高频操作,无论是整理下载目录、处理批量生成的报表,还是清洗训练数据集,都绕不开这一步。最直接的做法是调用os模块的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