我的知识记录

Python批量重命名Excel文件:按规则一键整理文件名

用Python遍历文件夹,按序号、日期、前缀规则批量重命名大量Excel文件,告别手动逐个改名,避免覆盖和重名冲突,附完整可运行代码。

场景痛点

领导丢过来一个文件夹,里面是 200 个「导出数据(1).xlsx」「新建 XLS 工作表.xlsx」这类乱名文件,要求统一改成「区域-日期-序号.xlsx」。手动改要拖半天,还容易漏、容易重名覆盖。用 Python 扫一遍目录、按规则生成新名、再逐个改名,几秒钟就能跑完。

用到的库

pip install openpyxl

重命名本身用标准库 osglob,不需要第三方包;代码里顺便用 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

Python批量重命名Excel文件:按规则一键整理文件名

标签:

更新时间:2026-09-15 09:19:33

上一篇:Python Excel两表对比找出差异

下一篇: