使用PyPDF2提取PDF文本至Excel无数据显示问题求助
嘿,我来帮你排查这个“程序不报错但Excel只出表头”的问题!这种情况大概率是数据提取环节没拿到内容,或者写入Excel时的逻辑有疏漏,咱们一步步拆解:
排查步骤
1. 先确认PDF文本是否被正确提取
很多PDF可能是扫描生成的图片格式、加密文件,或者排版特殊导致提取不到文本。先加一段调试代码,把每页提取到的原始内容打出来看看:
# 假设你用的是PyPDF2或pdfplumber,以pdfplumber为例 import pdfplumber with pdfplumber.open("你的文件.pdf") as pdf: for idx, page in enumerate(pdf.pages): raw_text = page.extract_text() print(f"=== 第{idx+1}页原始文本 ===") print(raw_text if raw_text else "当前页未提取到任何文本!")
如果打印结果是空的或者乱码,那问题根源在PDF文本提取:
- 若是扫描件,得用OCR工具(比如
pytesseract)配合处理; - 换个更稳定的PDF库,比如
pdfplumber比PyPDF2更擅长复杂排版的文本提取。
2. 检查正则表达式是否精准匹配数据
你的目标格式是Loan #: 0065192080/3000009289 Pool#: AK1576 Borrower: David h Theman,正则必须能准确捕获这四个字段。试试这段调试代码验证匹配效果:
import re # 适配格式的正则(注意空格、特殊符号的匹配) pattern = r"Loan #: (\d+)\/(\d+) Pool#: (\S+) Borrower: (.+)" # 如果文本有换行,加re.DOTALL参数:pattern = r"Loan #: (\d+)\/(\d+)\s+Pool#: (\S+)\s+Borrower: (.+)", flags=re.DOTALL # 用提取到的raw_text测试匹配 match_result = re.search(pattern, raw_text) if match_result: loan_id1 = match_result.group(1) loan_id2 = match_result.group(2) pool_num = match_result.group(3) borrower = match_result.group(4) print(f"匹配成功:{loan_id1}, {loan_id2}, {pool_num}, {borrower}") else: print("当前页未匹配到目标数据!")
如果匹配失败,要调整正则:比如PDF里的Loan #可能写成Loan#(无空格),或者字段之间有换行,那就把正则里的空格换成\s+匹配任意空白字符,或者加上re.DOTALL处理跨行内容。
3. 验证Excel写入逻辑是否正确
如果你用pandas:
要确保提取到的数据被正确追加到列表,最后确实执行了写入操作:
import pandas as pd data_rows = [] # 初始化列表存所有页的数据 # 遍历每页提取数据后,追加到列表 if match_result: data_rows.append({ "贷款编号1": loan_id1, "贷款编号2": loan_id2, "Pool#": pool_num, "借款人": borrower }) # 最后写入Excel(别漏了index=False,避免生成多余的索引列) df = pd.DataFrame(data_rows) df.to_excel("输出文件.xlsx", index=False)
如果你用openpyxl:
要注意不要在循环里重复创建Workbook(会覆盖之前的数据),且必须执行save():
from openpyxl import Workbook wb = Workbook() ws = wb.active ws.append(["贷款编号1", "贷款编号2", "Pool#", "借款人"]) # 写入表头 # 遍历每页提取数据后,追加行 if match_result: ws.append([loan_id1, loan_id2, pool_num, borrower]) wb.save("输出文件.xlsx") # 这一步绝对不能忘!
4. 检查分页遍历逻辑
比如用PyPDF2时,页数遍历是否正确:
from PyPDF2 import PdfReader reader = PdfReader("你的文件.pdf") # 确保遍历所有页:range(len(reader.pages)) for page_num in range(len(reader.pages)): page = reader.pages[page_num] # 提取文本、匹配数据...
别犯“只遍历了第一页”或者索引越界的错误。
按这个顺序排查,基本能找到问题所在——大概率是文本没提取到,或者正则没匹配上,导致没有数据写入Excel。
内容的提问来源于stack exchange,提问作者Izzyhv_
相关产品推荐
相关产品推荐

