如何匹配Excel文件列数据批量重命名文件夹内的文件
匹配Excel字段批量重命名PDF 修复方案
你贴的代码有几个硬伤,直接跑肯定出问题,我改了一版效率更高、容错更好的实现,改完配置就能直接用。
原代码核心问题
- 路径硬编码:
rename_file函数内写死了固定路径,传入的待重命名文件参数完全没被调用,循环多少次都只会操作同一个错误路径 - 语法错误:Windows路径的反斜杠是Python转义字符,直接写会被识别为特殊字符;
if __name__ == "__main__"块下的代码没有缩进,运行直接报语法错 - 逻辑低效:每处理一个PDF就重新加载一次Excel,文件量大时运行速度极慢
- 匹配鲁棒性差:直接用全等判断文件名和Excel字段,遇到大小写不一致、字段前后带空格的情况会匹配失败
- 参数未生效:传入的Excel路径参数完全没被调用,函数内硬编码的Excel路径还漏了
.xlsx后缀 - 无容错处理:遇到匹配不到对应税号、目标文件名重名、文件被占用的情况会直接中断运行,没有错误提示
前置依赖安装
注意xlrd 2.0以上版本不再支持xlsx格式,直接安装1.2.0版本最省事,执行命令:pip install xlrd==1.2.0
修正后可直接运行的代码
from pathlib import Path import xlrd # -------------------------- 配置项 按需修改 -------------------------- EXCEL_PATH = r"C:\Users\Chris\Box\Capital\Fund, 2 L.P\Tax\Fund 2 LP - Document Uploader ID 2021.xlsx" PDF_DIR = r"C:\Users\Chris\Box\Capital\Fund, 2 L.P\Tax\2021 Final" NAME_COL_INDEX = 4 # 姓名所在列索引,从0开始计数,比如E列对应索引4 TAX_ID_COL_INDEX = 3 # 税号所在列索引,从0开始计数,税号在姓名列左侧就填3、右侧就填5,按实际列位置改 # ------------------------------------------------------------------- name_taxid_map = {} def load_name_taxid_map(excel_path): """一次性加载Excel所有姓名-税号映射,避免重复读文件拖慢速度""" wb = xlrd.open_workbook(excel_path) sheet = wb.sheet_by_index(0) # 第一行是表头就从第2行开始读(range(1, sheet.nrows)),没有表头就把1改成0 for row_num in range(1, sheet.nrows): row_val = sheet.row_values(row_num) # 统一转小写、去前后空格做匹配key,消除格式差异导致的匹配失败 name = str(row_val[NAME_COL_INDEX]).strip().lower() tax_id = str(row_val[TAX_ID_COL_INDEX]).strip() if name and tax_id: name_taxid_map[name] = tax_id def batch_rename_pdfs(pdf_dir): """遍历目录下所有PDF,匹配映射表完成重命名""" pdf_files = Path(pdf_dir).glob("*.pdf") for pdf_path in pdf_files: file_stem = pdf_path.stem.strip().lower() if file_stem not in name_taxid_map: print(f"[跳过] 未找到对应税号:{pdf_path.name}") continue # 按需求拼接新文件名:原姓名 税号.pdf,保留原文件名的姓名大小写格式 new_file_name = f"{pdf_path.stem.strip()} {name_taxid_map[file_stem]}{pdf_path.suffix}" new_file_path = pdf_path.parent / new_file_name if new_file_path.exists(): print(f"[跳过] 目标文件名已存在:{new_file_name}") continue try: pdf_path.rename(new_file_path) print(f"[成功] 已重命名:{pdf_path.name} -> {new_file_name}") except Exception as e: print(f"[失败] 重命名{pdf_path.name}出错:{str(e)}") if __name__ == "__main__": load_name_taxid_map(EXCEL_PATH) batch_rename_pdfs(PDF_DIR)
使用注意事项
- 运行前先修改代码最上方配置块的四个参数,路径前面记得加
r前缀避免转义错误 - 列索引从0开始计数,A列对应0、B列对应1,以此类推,数清楚姓名和税号所在列再填参数
- 第一次运行前务必备份所有PDF文件,避免重命名出错无法恢复
- 运行时会打印每个文件的处理结果,跳过的文件会标注原因,不会直接中断程序
内容的提问来源于stack exchange,提问作者ShreddedScientist
相关产品推荐
相关产品推荐

