使用Python通过tabula-py转换PDF为CSV仅显示列名无内容如何解决
问题原因及解决方案
核心遗漏配置项
- 未指定表格识别模式:tabula-py默认不会自动适配带边框/无边框的表格,90%的空数据问题都是因为没有开启
lattice或stream参数 - 未校验读取结果:直接对返回的DataFrame赋值列名导出,没有确认是否真的读取到了表格内容
- 坐标参数匹配错误:自定义的
area和columns坐标范围偏差,把表格内容排除在了识别区域外
具体操作步骤
- 先添加识别模式参数:如果你的PDF表格是带实线边框的,添加
lattice=True;如果是无框靠空格分隔的文本表格,添加stream=True - 读取后先校验数据:输出DataFrame的行数和内容,确认读取正常再做后续处理
- 调整坐标范围:如果加了识别模式还是空,先注释掉
area和columns参数,让tabula自动识别页面内容,确认能读到数据后再微调坐标适配自定义列 - 导出CSV时添加可选参数避免冗余内容和乱码
修改后可运行的参考代码
#!/usr/bin/env python3 import tabula import pandas as pd pdf_file='document-page1.pdf' column_names=['Product','Batch No','Machin No','Time','Date','Drum/Bag No','Tare Wt.kg','Gross Wt.kg', 'Net Wt.kg','Blender','Remarks','Operator'] # Page 1 processing 带边框表格用lattice=True,无框表格替换为stream=True df_list = tabula.read_pdf( pdf_file, pages=1, lattice=True, area=(95,20, 800, 840), columns=[93,180,220,252,310,315,333,367,410,450,480,520], pandas_options={'header': None} ) # 先校验是否读取到了表格 if len(df_list) == 0 or df_list[0].empty: print("未识别到表格内容,请调整识别参数或坐标范围") else: df = df_list[0] # 确认列数匹配后再处理 if df.shape[1] == len(column_names)+1: df = df.drop(columns=5) df.columns = column_names # 导出时去掉索引列,设置编码避免乱码 df.to_csv('result.csv', index=False, encoding='utf_8_sig') print(f"导出成功,共{df.shape[0]}条数据") else: print(f"识别到的列数{df.shape[1]}与预期不匹配,请调整columns参数")
内容的提问来源于stack exchange,提问作者linux01
相关产品推荐
相关产品推荐

