Python多PDF合并代码扩容报错及输出文件名优化诉求
Python PDF合并代码报错修复与优化
问题分析
报错IndexError: list index out of range出现在筛选匹配文件的代码行,核心原因是:第一个文件夹中的某个PDF文件,在第二个文件夹里找不到包含对应key的匹配文件,导致筛选出的结果列表为空,强行取索引0就会触发报错。
另外原代码还有几个影响大规模文件处理的隐性问题:
- 变量名冲突:把传入的文件夹路径变量直接覆盖成了文件名列表,后续路径拼接会出错
- 合并文件重名:所有合并结果都用
merged_file.pdf命名,会被不断覆盖 - 路径拼接不规范:用字符串拼接路径,跨操作系统可能出问题
- 未确保输出文件夹存在:注释掉了创建文件夹的代码,若输出文件夹不存在会直接报错
- 资源未释放:每次创建
PdfMerger后没有关闭,处理大量文件时可能导致资源泄漏
修复与优化方案
- 修复变量名冲突:将存储文件名列表的变量改名,和文件夹路径变量彻底区分开
- 处理无匹配文件的情况:先检查筛选结果是否为空,为空时跳过并打印提示,避免报错中断整个程序
- 自定义合并后文件名:用原文件的key作为合并后的文件名(比如
原文件名_merged.pdf),彻底避免文件覆盖 - 规范路径拼接:用
os.path.join()处理路径,自动适配Windows/Linux等不同系统的路径分隔符 - 确保输出文件夹存在:用
os.makedirs(exist_ok=True)创建文件夹,文件夹已存在时不会报错 - 释放资源:每次合并完成后调用
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
相关产品推荐
相关产品推荐

