Python批量提取多PDF文本写入Excel并记录文件名的代码修正
问题修复方案
你现有代码存在几处逻辑错误,修复后可实现批量PDF处理、对应行写入文件名、多余空格清理的全部需求。
现有代码核心问题
- 路径遍历逻辑错误:引用了未定义的
directory变量,glob匹配规则有误,会出现路径拼接错误、漏找PDF的问题 - 写入行号错误:enumerate起始值设为1,会把内容写入A1/B1,不符合从A2/B2开始写入的要求
- 文本提取逻辑错误:重复读取第一页内容、单页文本未做累加、直接对字符串调用
join导致文本拆分混乱 - 无空白清理逻辑:PyPDF2默认提取的文本会保留PDF排版产生的大量连续空格、无效换行,没有做归一化处理
修正后可直接运行的代码
import PyPDF2 import openpyxl import os import glob import re # 配置项 替换为你自己的实际路径 root_dir = "你的PDF存放文件夹路径/" # 注意路径末尾要加斜杠 excel_path = "excel.xlsx" # 替换为你的Excel文件路径 # 1. 递归获取目录下所有PDF文件的合法路径 filenames = [] for filename in glob.iglob(root_dir + '**/*.pdf', recursive=True): if os.path.isfile(filename): filenames.append(filename) # 2. 初始化Excel文件 wb = openpyxl.load_workbook(excel_path) sheet = wb.active sheet.title = 'MyPDF' # 写入表头 sheet['A1'] = 'PDF提取文本' sheet['B1'] = 'PDF文件名' # 3. 逐个处理PDF,从第2行开始写入内容 for row, pdf_path in enumerate(filenames, start=2): full_text = [] with open(pdf_path, 'rb') as f: # 加strict=False兼容非标准格式PDF,避免读取报错 pdfReader = PyPDF2.PdfFileReader(f, strict=False) page_count = pdfReader.numPages # 逐页提取文本 for page_idx in range(page_count): page = pdfReader.getPage(page_idx) page_text = page.extractText() if page_text: # 清理多余空白:将连续空格、换行、制表符统一替换为单个空格,去除首尾无效空白 page_text = re.sub(r'\s+', ' ', page_text).strip() full_text.append(page_text) # A列写入拼接后的完整文本 sheet[f'A{row}'].value = '\n'.join(full_text) # B列写入对应PDF的文件名(不需要路径就保留os.path.basename,需要完整路径直接替换为pdf_path即可) sheet[f'B{row}'].value = os.path.basename(pdf_path) # 4. 保存修改 wb.save(excel_path) print(f'处理完成!共处理{len(filenames)}个PDF文件')
关键修改说明
- 路径匹配逻辑修正:用
**/*.pdf规则递归匹配所有PDF文件,移除未定义的变量,增加文件类型校验,避免把文件夹当PDF处理 - 写入位置修正:enumerate起始行设为2,第一行预留表头,完全匹配A2/B2开始写入的要求
- 文本提取逻辑修正:逐页提取的文本统一存入列表累加,解决重复读第一页、文本丢失、字符串错误拆分的问题
- 多余空格处理:通过正则将所有连续空白字符归一化为单个空格,彻底解决提取文本存在大量冗余空格、换行的问题
- 兼容性优化:读取PDF时增加
strict=False参数,兼容大部分格式不规范的PDF文件,减少运行报错
如果你使用的是新版PyPDF2,
PdfFileReader已被标记为弃用,可替换为PdfReader,对应调整为len(pdfReader.pages)获取页数、pdfReader.pages[page_idx]获取页面对象即可,功能逻辑完全一致。
内容的提问来源于stack exchange,提问作者Gabry
相关产品推荐
相关产品推荐

