使用tabula、tabulate导出PDF表格出现多列合并异常问题咨询
解决tabula读取PDF表格列合并问题的方案
出现前三列被识别为同一列的核心原因是tabula默认自动列检测逻辑误判了列边界,可通过以下方法解决:
方案1:手动指定列边界(准确率最高)
手动传入每列左侧的x轴坐标(单位为磅,从PDF页面左边缘开始计算),关闭自动列检测即可:
import tabula # 替换为实际测量的5列对应的左侧x坐标 custom_columns = [45, 110, 190, 270, 350] df_list = tabula.read_pdf( "你的PDF文件路径.pdf", pages="1", # 替换为表格所在的页码,all代表所有页 columns=custom_columns, guess=False, # 关闭自动列检测,强制使用自定义边界 lattice=True # 有边框表格加该参数,无边框表格替换为stream=True ) target_df = df_list[0]
坐标可以通过PDF阅读器开启坐标显示功能查看,也可以先运行一次不带columns参数的代码,输出默认识别的列坐标后再微调。
方案2:读取后拆分合并列
如果不想调整读取参数,可以对已读取到的合并列直接拆分:
import pandas as pd # 假设合并的前三列存储在df的第一列中,按空格拆分2次得到3个新列 target_df[["第一列", "第二列", "第三列"]] = target_df.iloc[:,0].str.split( expand=True, n=2 # 最多拆分2次,避免内容本身带空格导致拆分错误 ) # 删除原始合并列 target_df = target_df.drop(target_df.columns[0], axis=1)
额外注意事项
- 如果是扫描版PDF,需要先通过OCR工具转换为可检索PDF后再用tabula读取
- 如果表格周围有其他无关内容,可以添加
area=[top, left, bottom, right]参数指定表格所在的页面区域,减少干扰
内容的提问来源于stack exchange,提问作者YIF99
相关产品推荐
相关产品推荐

