每次整理文件,你都要做这件事:
然后你手动右键、重命名、输入、回车……重复 100 次。
有没有更好的办法?有,Python 5 行代码搞定。
这篇文章教你用 Python 批量重命名文件,3 分钟学会,终身受益。
场景一:给所有文件加前缀
需求
文件夹里有 100 个文件,要给所有文件名加上日期前缀,比如:
原文件名: report.xlsx新文件名: 2026-05-27_report.xlsx
代码(只需 5 行)
import osfrom datetime import datetimefolder = 'data/' # 文件夹路径prefix = datetime.now().strftime('%Y-%m-%d') + '_' # 日期前缀# 批量重命名for filename in os.listdir(folder): os.rename(folder + filename, folder + prefix + filename)print('重命名完成!')
运行结果
原文件名:report.xlsxsales.xlsxuser.xlsx新文件名:2026-05-27_report.xlsx2026-05-27_sales.xlsx2026-05-27_user.xlsx
场景二:给所有文件加后缀
需求
给所有 Excel 文件加上"_backup"后缀:
原文件名: report.xlsx新文件名: report_backup.xlsx
代码
import osfolder = 'data/'for filename in os.listdir(folder): if filename.endswith('.xlsx'): # 只处理 Excel 文件 name, ext = os.path.splitext(filename) # 分离文件名和后缀 new_name = f'{name}_backup{ext}' os.rename(folder + filename, folder + new_name)print('重命名完成!')
运行结果
原文件名:report.xlsxsales.xlsxuser.xlsx新文件名:report_backup.xlsxsales_backup.xlsxuser_backup.xlsx
场景三:替换文件名中的字符
需求
把文件名中的空格替换成下划线:
原文件名: sales report.xlsx新文件名: sales_report.xlsx
代码
import osfolder = 'data/'for filename in os.listdir(folder): if ' ' in filename: # 文件名中有空格 new_name = filename.replace(' ', '_') # 空格替换为下划线 os.rename(folder + filename, folder + new_name) print(f'{filename} -> {new_name}')print('重命名完成!')
运行结果
sales report.xlsx -> sales_report.xlsxuser data.xlsx -> user_data.xlsxmonthly report.xlsx -> monthly_report.xlsx重命名完成!
场景四:批量修改文件名格式
需求
把中文日期改成英文格式:
原文件名: 报表_2026年05月27日.xlsx新文件名: report_20260527.xlsx
代码
import osimport refolder = 'data/'for filename in os.listdir(folder): # 提取日期 match = re.search(r'(\d{4})年(\d{2})月(\d{2})日', filename) if match: year, month, day = match.groups() new_date = f'{year}{month}{day}' new_name = f'report_{new_date}.xlsx' os.rename(folder + filename, folder + new_name) print(f'{filename} -> {new_name}')print('重命名完成!')
运行结果
报表_2026年05月27日.xlsx -> report_20260527.xlsx报表_2026年05月28日.xlsx -> report_20260528.xlsx报表_2026年05月29日.xlsx -> report_20260529.xlsx重命名完成!
场景五:按序号重命名
需求
把所有图片按序号重命名:
原文件名: IMG_001.jpg, photo.png, 截图.jpg新文件名: 001.jpg, 002.jpg, 003.jpg
代码
import osfolder = 'images/'# 获取所有图片文件files = [f for f in os.listdir(folder) if f.endswith(('.jpg', '.png', '.jpeg'))]# 按序号重命名for i, filename in enumerate(files, 1): ext = os.path.splitext(filename)[1] # 获取后缀 new_name = f'{i:03d}{ext}' # 001.jpg, 002.jpg... os.rename(folder + filename, folder + new_name) print(f'{filename} -> {new_name}')print(f'重命名完成!共 {len(files)} 个文件')
运行结果
IMG_001.jpg -> 001.jpgphoto.png -> 002.png截图.jpg -> 003.jpg重命名完成!共 3 个文件
场景六:从 Excel 读取新文件名
需求
有一个 Excel 文件,记录了旧文件名和新文件名的对应关系,批量重命名。
Excel 内容
代码
import osimport pandas as pdfolder = 'data/'mapping_file = 'rename_mapping.xlsx'# 读取映射关系df = pd.read_excel(mapping_file)# 批量重命名for _, row in df.iterrows(): old_name = row['旧文件名'] new_name = row['新文件名'] if os.path.exists(folder + old_name): os.rename(folder + old_name, folder + new_name) print(f'{old_name} -> {new_name}') else: print(f'文件不存在: {old_name}')print('重命名完成!')
运行结果
old_1.xlsx -> 2026Q1_sales.xlsxold_2.xlsx -> 2026Q2_sales.xlsxold_3.xlsx -> 2026Q3_sales.xlsx重命名完成!
场景七:递归重命名子文件夹
需求
文件夹下还有子文件夹,要递归处理所有文件。
代码
import osfolder = 'data/'# 递归遍历所有文件for root, dirs, files in os.walk(folder): for filename in files: if ' ' in filename: old_path = os.path.join(root, filename) new_name = filename.replace(' ', '_') new_path = os.path.join(root, new_name) os.rename(old_path, new_path) print(f'{old_path} -> {new_name}')print('重命名完成!')
常见问题
Q1:如何撤销重命名?
先备份原文件名列表:
import osimport pandas as pdfolder = 'data/'# 保存原文件名files = os.listdir(folder)df = pd.DataFrame({'原文件名': files})df.to_excel('original_names.xlsx', index=False)print('原文件名已备份!')
然后如果需要恢复,用场景六的方法。
Q2:文件名冲突怎么办?
检查新文件名是否已存在:
import osfolder = 'data/'prefix = '2026-05-27_'for filename in os.listdir(folder): new_name = prefix + filename # 检查新文件名是否已存在 if os.path.exists(folder + new_name): print(f'文件名冲突: {new_name},跳过') continue os.rename(folder + filename, folder + new_name)print('重命名完成!')
Q3:只处理特定类型的文件?
import osfolder = 'data/'# 只处理 Excel 和 CSV 文件allowed_extensions = ('.xlsx', '.xls', '.csv')for filename in os.listdir(folder): if filename.endswith(allowed_extensions): # 重命名逻辑 pass
Q4:如何预览重命名结果?
先打印预览,确认无误再执行:
import osfolder = 'data/'prefix = '2026-05-27_'# 预览模式print('预览重命名结果:')for filename in os.listdir(folder): new_name = prefix + filename print(f'{filename} -> {new_name}')# 确认后执行confirm = input('确认执行吗?(y/n): ')if confirm.lower() == 'y': for filename in os.listdir(folder): os.rename(folder + filename, folder + prefix + filename) print('重命名完成!')else: print('已取消')
完整代码模板(复制即用)
import osimport pandas as pdfrom datetime import datetimedef batch_rename(folder, mode='prefix', pattern='', mapping_file=None): """ 批量重命名文件 参数: - folder: 文件夹路径 - mode: 重命名模式(prefix/suffix/replace/sequence/mapping) - pattern: 前缀/后缀/替换内容 - mapping_file: 映射文件路径(mapping模式使用) """ if not os.path.exists(folder): print('文件夹不存在!') return # 备份原文件名 files = os.listdir(folder) backup = pd.DataFrame({'原文件名': files}) backup.to_excel('rename_backup.xlsx', index=False) if mode == 'prefix': # 加前缀 for filename in files: os.rename(folder + filename, folder + pattern + filename) elif mode == 'suffix': # 加后缀 for filename in files: name, ext = os.path.splitext(filename) os.rename(folder + filename, folder + name + pattern + ext) elif mode == 'replace': # 替换字符 old, new = pattern.split('->') for filename in files: if old in filename: os.rename(folder + filename, folder + filename.replace(old, new)) elif mode == 'sequence': # 按序号重命名 for i, filename in enumerate(files, 1): ext = os.path.splitext(filename)[1] os.rename(folder + filename, folder + f'{i:03d}{ext}') elif mode == 'mapping': # 从Excel读取映射 df = pd.read_excel(mapping_file) for _, row in df.iterrows(): if os.path.exists(folder + row['旧文件名']): os.rename(folder + row['旧文件名'], folder + row['新文件名']) print(f'重命名完成!共处理 {len(files)} 个文件')# 使用示例# batch_rename('data/', mode='prefix', pattern='2026-05-27_')# batch_rename('data/', mode='suffix', pattern='_backup')# batch_rename('data/', mode='replace', pattern=' ->_')# batch_rename('data/', mode='sequence')# batch_rename('data/', mode='mapping', mapping_file='rename_mapping.xlsx')
总结
Python 批量重命名文件,核心就 2 个函数:
| | |
|---|
os.listdir() | | os.listdir('data/') |
os.rename() | | os.rename('old.txt', 'new.txt') |
5 行代码,解决 100 个文件重命名的重复劳动。
进阶方向
学会批量重命名后,可以继续扩展:
Python 是分析师的效率神器,从一个小脚本开始,逐步积累你的工具箱。