1. 问题背景:为什么要批量重命名多个工作簿
本文主题是 批量重命名多个工作簿。这个案例看起来不复杂,但在真实办公场景里非常实用,尤其适合处理一批命名不规范、带有统一前缀或统一关键字的 Excel 文件。
我对这节内容的理解是:它不是单纯学习一个 os.rename() 函数,而是在练习一种很基础、也很关键的自动化思维: 先批量找到目标文件,再按照规则生成新文件名,最后统一执行重命名。
这张图展示的是本文的主问题:使用 Python 对多个 Excel 工作簿进行批量重命名。

从图中可以看出,本文处理的对象不是某一个 Excel 表格里的单元格数据,而是文件夹中的多个 Excel 文件本身。这个区别很重要:改工作表名称属于 Excel 内部操作,改工作簿文件名属于文件系统操作。这两类问题的代码思路完全不同,不能混在一起理解。
在办公自动化里,文件名标准化是一个很容易被忽略的问题。文件名不统一时,后续归档、检索、汇总、同步网盘、批量导入系统都会变麻烦。手动改几个文件还能忍,如果是一百个、几百个 Excel 文件,继续靠人工就不现实了。
2. 适用场景:哪些情况适合用这个方法
这个案例最典型的场景,就是文件名中存在相同关键字,需要统一替换或删除。比如业务系统导出的文件全部带有“销售表”,后来部门要求统一改成“营收表”;或者文件名中带有“最终版”“新版”“副本”等多余文字,需要统一清理。
这张图展示的是一个非常典型的批量替换文件名场景:把文件名中的“销售表”统一替换成“营收表”。

从图中能看出,批量重命名不是简单地把所有文件改成同一个名字,而是只替换文件名中的某一段关键字。也就是说,原文件名中的月份、地区、编号等有效信息仍然保留,只把不符合要求的关键词替换掉。
比如原来有这些文件:
销售表_1月.xlsx
销售表_2月.xlsx
销售表_3月.xlsx
销售表_4月.xlsx
销售表_5月.xlsx
批量处理后可以变成:
营收表_1月.xlsx
营收表_2月.xlsx
营收表_3月.xlsx
营收表_4月.xlsx
营收表_5月.xlsx
推荐做法:如果只是替换文件名中的固定关键词,优先使用 replace()。这种方式简单、直接、可读性强,新手也容易排查。
不建议的做法:直接根据序号重新生成全部文件名。除非你非常确认原文件名没有任何保留价值,否则容易把月份、项目名、地区名这些重要信息一起覆盖掉。
3. 核心原理:遍历、筛选、替换、重命名
这个案例的核心流程可以拆成四步:第一步遍历文件夹,第二步筛选目标文件,第三步替换文件名关键字,第四步执行重命名。只要这四步想清楚,代码就不难。
这张图展示的是整个脚本的核心执行流程。

从图中可以看出,真正稳妥的批量处理,不是一上来就执行重命名,而是先经过筛选。尤其是 Excel 文件夹里经常会出现 ~$ 开头的临时文件,如果不跳过,就可能导致脚本报错。
原理说明:os.listdir() 负责拿到文件夹中的文件列表,replace() 负责生成新文件名,os.path.join() 负责拼接完整路径,os.rename() 负责真正执行重命名。
这里最关键的判断不是语法,而是流程顺序。先筛选,再重命名;先生成新路径,再执行修改。这个顺序不能乱。
4. 实现代码:用 os 批量处理文件名
下面这段代码是一个相对稳妥的基础版本。它不会处理非 Excel 文件,也会跳过 Excel 打开时产生的临时文件。使用前只需要修改 folder_path、old_book_name 和 new_book_name。
import os
# 1. 需要批量重命名的文件夹路径
folder_path = r"e:\file"
# 2. 旧关键字和新关键字
old_book_name = "销售表"
new_book_name = "营收表" # 如果想删除旧关键字,可以写成 ""
# 3. 遍历文件夹中的文件
for file_name in os.listdir(folder_path):
# 跳过 Excel 临时文件
if file_name.startswith("~$"):
continue
# 只处理 Excel 工作簿文件
if not file_name.lower().endswith((".xlsx", ".xls", ".xlsm")):
continue
# 文件名中不包含旧关键字就跳过
if old_book_name not in file_name:
continue
# 生成新文件名
new_file_name = file_name.replace(old_book_name, new_book_name)
# 拼接完整路径
old_path = os.path.join(folder_path, file_name)
new_path = os.path.join(folder_path, new_file_name)
# 执行重命名
os.rename(old_path, new_path)
print(f"重命名完成:{file_name} -> {new_file_name}")
这段代码的核心不是长,而是每一步都比较清楚。continue 的作用就是跳过不符合条件的文件,让脚本只处理真正需要处理的 Excel 工作簿。
推荐做法:第一次运行前,可以先把 os.rename(old_path, new_path) 注释掉,只打印新旧文件名,确认结果没问题后再正式执行。
# 先预览,不真正改名
print(f"预览:{file_name} -> {new_file_name}")
# 确认无误后,再打开下面这一行
# os.rename(old_path, new_path)
风险提醒:批量重命名属于不可轻视的文件操作。如果规则写错,可能一次性改乱大量文件名。真实工作中不要直接对原始文件夹开干,先复制一份测试目录再运行脚本。
5. 举一反三:从改工作簿名扩展到改工作表名
这一节的基础案例是批量修改工作簿文件名,但如果继续往前走,就会遇到另一个高频需求:文件夹中有很多 Excel 工作簿,每个工作簿里面都有一个默认工作表 Sheet1,现在要统一改成 汇总。
这张图展示的是进阶批处理思路:用 os 管文件遍历,用 xlwings 管 Excel 内部工作表。

从图中可以看出,os 和 xlwings 的职责不一样。os 适合处理文件夹、文件名、路径这些文件系统层面的事情;xlwings 更适合打开 Excel、读取工作表、修改工作表名称、保存工作簿。
下面是一个进阶示例:批量打开文件夹中的 Excel 工作簿,把里面的 Sheet1 改成 汇总。
import os
import xlwings as xw
folder_path = r"e:\file"
old_sheet_name = "Sheet1"
new_sheet_name = "汇总"
app = xw.App(visible=False, add_book=False)
try:
for file_name in os.listdir(folder_path):
if file_name.startswith("~$"):
continue
if not file_name.lower().endswith((".xlsx", ".xls", ".xlsm")):
continue
full_path = os.path.join(folder_path, file_name)
wb = app.books.open(full_path)
sheet_names = [sheet.name for sheet in wb.sheets]
if old_sheet_name in sheet_names:
wb.sheets[old_sheet_name].name = new_sheet_name
wb.save()
print(f"{file_name}:{old_sheet_name} -> {new_sheet_name}")
wb.close()
finally:
app.quit()
原理说明:这段代码比前面的文件重命名更进一步,因为它不是修改文件名,而是打开 Excel 文件并修改里面的工作表对象。所以它需要调用 Excel 相关库,而不是只靠 os.rename()。
注意:如果目标工作簿里已经存在名为 汇总 的工作表,直接改名可能报错。真实使用时最好先判断新工作表名是否已经存在。
6. 常见问题:批量重命名最容易踩的坑
批量重命名看起来简单,但真正容易出问题的地方并不在 os.rename() 这一句,而是在执行前的判断不够严谨。尤其是文件被占用、临时文件没有过滤、目标文件名重复、路径写错,这些问题都很常见。
这张图展示的是批量重命名 Excel 工作簿时需要提前检查的几个关键点。

从图中能看出,安全检查至少包含四类:跳过 ~$ 临时文件、只处理 Excel 文件、判断文件名是否包含关键字、执行前先预览结果。这几步看似啰嗦,但能避免很多低级事故。
坑 1:Excel 文件正在打开。如果文件正在被 Excel 占用,重命名时可能失败。处理前最好关闭目标文件夹里的 Excel 工作簿。
坑 2:新文件名已经存在。如果替换后的新文件名和已有文件重名,可能导致报错。稳妥写法应该在执行前判断 new_path 是否已经存在。
if os.path.exists(new_path):
print(f"跳过:目标文件已存在 -> {new_file_name}")
continue
坑 3:关键字范围太宽。比如你要替换“表”,结果所有带“表”的文件名都会被处理,这种规则就太粗了。批量操作里,关键字越精确越安全。
我的建议:正式处理前先执行“预览模式”,把新旧文件名打印出来,确认没有误改后再放开 os.rename()。
7. 效果验证:不要只看脚本有没有报错
很多新手运行脚本时,只关注控制台有没有报错。但对批量文件操作来说,没有报错不代表结果完全正确。更稳妥的做法是运行后检查文件夹内容,确认文件数量、文件扩展名、命名规则是否符合预期。
我一般会按下面几个点验证:
第一,检查处理前后的文件数量是否一致。如果只是重命名,文件数量不应该减少。
第二,检查旧关键字是否已经全部替换。比如原来要替换“销售表”,处理后文件夹中就不应该再出现带“销售表”的目标文件。
第三,随机打开几个 Excel 文件,确认文件本身没有损坏。虽然 os.rename() 正常情况下不会修改文件内容,但如果路径或文件状态异常,还是要做基本验证。
第四,把控制台输出保留下来。如果后续发现文件名不对,至少能根据日志追溯原文件名和新文件名。
print(f"处理完成:{old_path} -> {new_path}")
原理说明:文件重命名本质上修改的是文件系统中的路径名称,不会直接改动 Excel 内容。但这不代表它没有风险,因为路径名称本身就是后续批处理、归档和查找的基础。
8. 总结提升:把这节变成自己的脚本模板
这一节的价值,不是记住一段固定代码,而是掌握批量文件处理的基本框架。以后遇到批量改名、批量筛选文件、批量移动文件、批量打开 Excel 的需求,都可以从这个框架继续扩展。
我认为这篇笔记最值得留下来的经验有三点。
第一, 先分清处理对象。如果是改文件名,用 os;如果是改 Excel 内部工作表,用 xlwings 或 openpyxl。对象不同,工具就不同。
第二, 批量操作必须先筛选。不要遍历到什么就处理什么。真实办公文件夹里可能有临时文件、PDF、TXT、CSV、备份文件,脚本必须先判断再执行。
第三, 正式执行前必须预览。批量脚本最怕“看起来能跑,结果全改错”。先打印新旧文件名,再正式重命名,这是最基本的安全习惯。
这类小案例看似基础,但如果真正练熟,就可以沉淀成自己的办公自动化工具箱。以后遇到重复改文件名、整理报表、归档数据时,就不需要再手动一个个点开修改了。












