使用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
相关产品推荐
相关产品推荐

