Python批量重命名Excel文件:按规则一键整理文件名
用Python遍历文件夹,按序号、日期、前缀规则批量重命名大量Excel文件,告别手动逐个改名,避免覆盖和重名冲突,附完整可运行代码。
场景痛点
领导丢过来一个文件夹,里面是 200 个「导出数据(1).xlsx」「新建 XLS 工作表.xlsx」这类乱名文件,要求统一改成「区域-日期-序号.xlsx」。手动改要拖半天,还容易漏、容易重名覆盖。用 Python 扫一遍目录、按规则生成新名、再逐个改名,几秒钟就能跑完。
用到的库
pip install openpyxl
重命名本身用标准库 os、glob,不需要第三方包;代码里顺便用 openpyxl 读取文件里的业务字段(如日期)来参与命名。
完整代码
import os
import glob
from datetime import datetime
from openpyxl import load_workbook
def build_new_name(file_path: str, index: int) -> str:
"""根据文件路径生成新文件名,index 为从 1 开始的序号。"""
folder = os.path.dirname(file_path)
ext = os.path.splitext(file_path)[1] # 保留原扩展名,如 .xlsx
# 尝试读取表格 A1 里的业务日期,失败则用今天
try:
wb = load_workbook(file_path, read_only=True, data_only=True)
ws = wb.active
value = ws["A1"].value
wb.close()
if isinstance(value, datetime):
date_part = value.strftime("%Y%m%d")
else:
date_part = datetime.today().strftime("%Y%m%d")
except Exception:
date_part = datetime.today().strftime("%Y%m%d")
# 命名规则:区域-日期-001.xlsx,这里区域写死示例,可按需改成从文件名截取
region = "华东"
new_name = f"{region}-{date_part}-{index:03d}{ext}"
return os.path.join(folder, new_name)
def rename_excel_files(folder: str, dry_run: bool = True) -> None:
"""批量重命名指定目录下的 .xlsx 文件。dry_run=True 时只打印不真改。"""
pattern = os.path.join(folder, "*.xlsx")
files = sorted(glob.glob(pattern))
print(f"共找到 {len(files)} 个 xlsx 文件")
used_names = set()
for index, old_path in enumerate(files, start=1):
new_path = build_new_name(old_path, index)
# 防止新名与已有文件或本次生成的其它名字冲突
if new_path in used_names:
raise RuntimeError(f"新名冲突: {new_path}")
used_names.add(new_path)
old_name = os.path.basename(old_path)
new_name = os.path.basename(new_path)
print(f"{old_name} -> {new_name}")
if not dry_run:
if os.path.exists(new_path):
print(f" 跳过:目标已存在 {new_name}")
continue
os.rename(old_path, new_path)
print("dry_run=True 仅预览,确认无误后传 dry_run=False 真正执行")
if __name__ == "__main__":
# 改成你自己的文件夹路径
rename_excel_files(r"D:\reports", dry_run=True)
代码讲解
glob.glob(os.path.join(folder, "*.xlsx"))把目录下所有 Excel 文件路径取出来,sorted保证每次顺序一致,序号不乱。build_new_name先用openpyxl以只读模式打开,读 A1 的日期作为命名依据;读失败就退回今天日期,脚本不会因为坏文件直接挂掉。f"{index:03d}"把序号补零成三位数,排序时001、002不会排在10后面。used_names集合用来检测本次生成的新名是否重复;os.path.exists再防一次和磁盘上已有文件撞名。dry_run参数非常关键:先打印「旧名 -> 新名」预览,人眼确认没问题,再改成False真改。
运行结果
先在 dry_run=True 下跑一遍,控制台打印出每个文件改名前后的对照;确认无误后把参数改成 False,文件被真正重命名。打开文件夹即可看到统一后的文件名。
注意事项
- 改之前先备份原文件夹,
os.rename一旦执行不可撤销。 - 不要把脚本放在被重命名的目录里,否则脚本自身也会被 glob 命中。
- 含中文名/空格的路径用原始字符串
r"..."包起来,避免转义出问题。 read_only=True打开大文件更快,但拿到的是计算后的值(data_only=True)。- 如果还要处理
.xls老格式,需要单独用xlrd或先另存为.xlsx,本篇只针对.xlsx。

更新时间:2026-09-15 09:19:33
下一篇: