You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何匹配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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 12:54:31