遍历PDF目录合并为单个TXT文件时遇PyPDF2报错求助
问题分析与修复
核心问题点
- 未过滤目录中的非PDF文件,导致
PdfFileReader尝试解析无效文件,抛出EOF marker not found错误 - 每次循环用
'w'模式写入文件,会清空之前的内容,最终仅保留最后一个PDF的内容(若未报错) - 重复创建
PdfFileReader实例,既低效又可能引发文件读取异常 - 异常处理过于宽泛,无法定位具体问题;手动关闭文件属于多余操作(
with语句会自动管理文件生命周期)
修复后的代码
import os from PyPDF2 import PdfFileReader, PdfReadError # 替换为你的目标目录路径 target_dir = "path" # 用追加模式打开输出文件,避免每次清空已有内容 with open('file.txt', 'a', encoding='utf-8') as output_file: # 遍历目录,仅处理后缀为.pdf的文件 for filename in os.listdir(target_dir): if not filename.lower().endswith('.pdf'): continue file_path = os.path.join(target_dir, filename) print(f"正在处理: {file_path}") try: # 单个PDF仅创建一次阅读器实例 pdf_reader = PdfFileReader(file_path, strict=False) total_pages = pdf_reader.numPages for page_num in range(total_pages): print(f"页码: {page_num + 1}/{total_pages}") page = pdf_reader.getPage(page_num) try: text = page.extractText() except Exception as e: print(f"提取页码{page_num + 1}失败: {str(e)}") continue # 写入文件标识与页码内容,提升可读性 output_file.write(f"=== 文件: {filename} 页码: {page_num + 1} ===\n") output_file.write(text + "\n\n") except PdfReadError as e: print(f"解析PDF失败 {file_path}: {str(e)}") continue
关键优化说明
- 增加PDF文件过滤:通过
filename.lower().endswith('.pdf')确保只处理合法PDF文件 - 切换写入模式为
'a':每次循环追加内容,保留所有PDF的文本信息 - 复用
PdfFileReader实例:每个PDF仅创建一次阅读器,提升效率并避免重复读取问题 - 细化异常处理:分别捕获PDF解析错误和文本提取错误,方便排查具体问题
- 移除多余的
file.close():with语句会自动关闭文件,无需手动操作 - 添加文件和页码标识:方便区分不同PDF的内容,提升合并后文本的可读性
内容的提问来源于stack exchange,提问作者mxrdybxm
相关产品推荐
相关产品推荐

