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

使用Python PyPDF2按文件名第三下划线前缀合并PDF及报错处理

问题解决方法

错误原因分析

  • 路径拼接缺失:os.listdir()仅返回目标目录下的文件名,不带父目录路径,原代码直接传文件名给merger.append(),程序会在当前脚本运行的工作目录查找文件,找不到就抛出FileNotFoundError。
  • 路径转义错误:原代码中写的"C:\test\raw"没有用原始字符串前缀,\t会被Python解析为制表符,导致实际读取的目录路径错误,也会引发找不到文件的问题。
  • 分组逻辑错误:原代码没有按第三段值先做文件分组,且PdfFileMerger的初始化、写入、关闭操作都放在了循环内部,每遍历一个文件就关闭合并器,后续文件无法追加,也没法实现同组合并。

修复后可运行代码

from PyPDF2 import PdfFileMerger
import os

# 定义路径,使用原始字符串r前缀避免转义问题
raw_dir = r"C:\test\raw"
result_dir = r"C:\test\result"
# 自动创建结果目录,避免目录不存在报错
os.makedirs(result_dir, exist_ok=True)

# 第一步:按文件名第三段值对文件做分组
group_dict = {}
for filename in os.listdir(raw_dir):
    # 跳过非PDF文件
    if not filename.endswith(".pdf"):
        continue
    # 拆分文件名,校验格式合法性
    name_parts = filename.split("_")
    if len(name_parts) < 3:
        print(f"跳过命名格式不符合的文件:{filename}")
        continue
    group_key = name_parts[2]
    # 拼接文件完整绝对路径
    full_file_path = os.path.join(raw_dir, filename)
    # 写入分组字典
    if group_key not in group_dict:
        group_dict[group_key] = []
    group_dict[group_key].append(full_file_path)

# 第二步:按分组合并PDF
for group_key, pdf_list in group_dict.items():
    # 每个分组单独创建合并器实例
    merger = PdfFileMerger()
    for pdf_path in pdf_list:
        merger.append(pdf_path)
    # 拼接输出文件路径
    output_path = os.path.join(result_dir, f"{group_key}_merged.pdf")
    merger.write(output_path)
    merger.close()
    print(f"分组{group_key}合并完成,输出文件:{output_path}")

关键修复点说明

  • 使用os.path.join()拼接父目录和文件名,获取文件的完整绝对路径,彻底解决找不到文件的报错。
  • 先遍历所有文件做分组,再逐组执行合并操作,符合按第三段值合并的需求。
  • 每个分组单独管理PdfFileMerger的生命周期,分组内所有文件追加完成后再执行写入和关闭操作,避免提前关闭合并器的问题。
  • 新增文件格式校验、自动创建结果目录逻辑,降低额外报错概率。

内容的提问来源于stack exchange,提问作者mike

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 18:06:04