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

Python多PDF合并代码扩容报错及输出文件名优化诉求

Python PDF合并代码报错修复与优化

问题分析

报错IndexError: list index out of range出现在筛选匹配文件的代码行,核心原因是:第一个文件夹中的某个PDF文件,在第二个文件夹里找不到包含对应key的匹配文件,导致筛选出的结果列表为空,强行取索引0就会触发报错。

另外原代码还有几个影响大规模文件处理的隐性问题:

  • 变量名冲突:把传入的文件夹路径变量直接覆盖成了文件名列表,后续路径拼接会出错
  • 合并文件重名:所有合并结果都用merged_file.pdf命名,会被不断覆盖
  • 路径拼接不规范:用字符串拼接路径,跨操作系统可能出问题
  • 未确保输出文件夹存在:注释掉了创建文件夹的代码,若输出文件夹不存在会直接报错
  • 资源未释放:每次创建PdfMerger后没有关闭,处理大量文件时可能导致资源泄漏

修复与优化方案

  1. 修复变量名冲突:将存储文件名列表的变量改名,和文件夹路径变量彻底区分开
  2. 处理无匹配文件的情况:先检查筛选结果是否为空,为空时跳过并打印提示,避免报错中断整个程序
  3. 自定义合并后文件名:用原文件的key作为合并后的文件名(比如原文件名_merged.pdf),彻底避免文件覆盖
  4. 规范路径拼接:用os.path.join()处理路径,自动适配Windows/Linux等不同系统的路径分隔符
  5. 确保输出文件夹存在:用os.makedirs(exist_ok=True)创建文件夹,文件夹已存在时不会报错
  6. 释放资源:每次合并完成后调用merger.close(),避免资源占用累积

优化后的完整代码

import os
from PyPDF2 import PdfMerger  # pip install PyPDF2


def merge_pdf(first_folder_path, second_folder_path, output_folder_path):
    # 确保输出文件夹存在,不存在则自动创建
    os.makedirs(output_folder_path, exist_ok=True)

    # 获取两个文件夹中的PDF文件名列表,兼容大小写后缀
    first_pdfs = [f for f in os.listdir(first_folder_path) if f.lower().endswith('.pdf')]
    second_pdfs = [f for f in os.listdir(second_folder_path) if f.lower().endswith('.pdf')]

    # 遍历第一个文件夹的所有PDF文件
    for pdf in first_pdfs:
        key = pdf.split('.')[0]
        print(f"正在处理: {key}")
        
        # 查找第二个文件夹中匹配的PDF文件
        matching_drafts = [f for f in second_pdfs if key in f]
        if not matching_drafts:
            print(f"警告: 未找到与 {key} 匹配的文件,跳过该文件")
            continue
        
        # 取第一个匹配的文件(若有多个匹配可根据需求调整逻辑)
        matching_draft = matching_drafts[0]
        
        # 初始化合并器并执行合并
        merger = PdfMerger()
        try:
            # 用os.path.join规范拼接路径
            merger.append(os.path.join(first_folder_path, pdf))
            merger.append(os.path.join(second_folder_path, matching_draft))
            
            # 合并后用原key命名文件,避免覆盖
            output_file = os.path.join(output_folder_path, f"{key}_merged.pdf")
            merger.write(output_file)
            print(f"合并完成: {output_file}")
        except Exception as e:
            print(f"合并 {key} 时出错: {str(e)}")
        finally:
            # 确保合并器资源被释放
            merger.close()

    print(f"所有文件处理完成,共处理 {len(first_pdfs)} 个文件")

# 调用函数,传入目标文件夹路径
merge_pdf('first_folder', 'second_folder', 'output_folder')

额外说明

  • 代码中用f.lower().endswith('.pdf')兼容大小写不同的PDF后缀(比如.PDF)
  • 如果第二个文件夹中可能存在多个匹配文件,可以根据需求调整选择逻辑(比如取最新修改的文件、按名称排序取第一个等)
  • 加入了异常捕获,单个文件合并出错不会中断整个程序,更适合大规模文件批量处理

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 02:22:40