Pandas将pdfminer提取的PDF表格数据写入CSV时格式错误如何解决
问题分析与修复方案
问题根因
- 当前代码每匹配到一个坐标对应的文本就单独追加一行到结果表,导致每行仅单个列有值,其余列均为空,和预期的同组关联字段位于同一行的要求不符
- 直接用
==判断浮点数坐标容易出现精度误差,可能漏匹配符合条件的文本 - pandas的
append方法已在较新版本中弃用,运行时会抛出警告
修复后的代码
import os import pandas as pd from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter from pdfminer.converter import PDFPageAggregator from pdfminer.layout import LAParams, LTTextBox from pdfminer.pdfpage import PDFPage path='My_Path' # 定义坐标匹配阈值,避免浮点数精度问题导致匹配失败 COORD_TOLERANCE = 1e-3 results = [] for file_name in os.listdir(path): print(file_name) fp = open(os.path.join(path, file_name), 'rb') rsrcmgr = PDFResourceManager() laparams = LAParams() device = PDFPageAggregator(rsrcmgr, laparams=laparams) interpreter = PDFPageInterpreter(rsrcmgr, device) pages = PDFPage.get_pages(fp) for page in pages: print('Processing next page...') interpreter.process_page(page) layout = device.get_result() # 初始化当前页的临时行数据,存储匹配到的三个字段 row_data = {'c': None, 'd': None, 'f': None} for lobj in layout: if isinstance(lobj, LTTextBox): x, y, text = lobj.bbox[0], lobj.bbox[3], lobj.get_text().strip() # 用阈值判断坐标匹配,规避浮点数精度误差 if abs(x - 50.520000749999994) < COORD_TOLERANCE and abs(y - 200.30424779999996) < COORD_TOLERANCE: row_data['c'] = text elif abs(x - 405.599991) < COORD_TOLERANCE and abs(y - 187.82423730000002) < COORD_TOLERANCE: row_data['d'] = text elif abs(x - 562.4399872500001) < COORD_TOLERANCE and abs(y - 187.82423730000002) < COORD_TOLERANCE: row_data['f'] = text # 当前页遍历完成后,将有有效数据的行加入结果列表 if any(row_data.values()): results.append(row_data) df_results = pd.DataFrame(results) print(df_results) # 指定utf-8-sig编码避免Excel打开时出现乱码,不需要分号分隔可修改sep参数为',' df_results.to_csv('coordinates_data.csv', index=False, sep=';', encoding='utf-8-sig')
额外优化说明
- 用
os.path.join拼接文件路径,兼容不同操作系统的路径分隔符规则 - 提取文本时新增
strip()方法,去除PDF文本自带的多余换行、空格 - 统一将所有匹配完成的数据一次性转为DataFrame,运行效率更高
内容的提问来源于stack exchange,提问作者Jonathan RZ
相关产品推荐
相关产品推荐

