Python的表格格式错误(熊猫错误?)

时间:2018-07-13 13:59:24

标签: python pandas pdf tabula

在线阅读后,我决定使用tabula-py从pdf文件中提取表格。我们使用Anaconda,我刚刚安装了tabula-py 1.1.1。

我想从一个简单的脚本开始,看看用一个带有一些文本和两个表的单页pdf文件(“ table_p16.pdf”)会做什么。

代码:

from tabula import read_pdf
df = read_pdf("table_p16.pdf")

错误:

  

拾取了JAVA_TOOL_OPTIONS:-Djava.security.properties = c:\ Windows \ Sun \ Java \ Deployment \ sam.security

     

回溯(最近通话最近一次):

     

文件“ H:/Personlich/SVN/blademat_tb/blademat_toolbox/utility/read_pdf.py”,第41行,在       df = read_pdf(“ table_p16.pdf”)

     

文件“ C:\ Users \ xxxxxxxxxxxx \ AppData \ Local \ Continuum \ Anaconda3 \ envs \ test_env \ lib \ site-packages \ tabula \ wrapper.py”,行117,在read_pdf中       返回pd.read_csv(io.BytesIO(输出),** pandas_options)

     

parser_f中的第709行“ C:\ Users \ xxxxxxxxxxxx \ AppData \ Local \ Continuum \ Anaconda3 \ envs \ test_env \ lib \ site-packages \ pandas \ io \ parsers.py”       返回_read(filepath_or_buffer,kwds)

     

文件“ C:\ Users \ xxxxxxxxxxxx \ AppData \ Local \ Continuum \ Anaconda3 \ envs \ test_env \ lib \ site-packages \ pandas \ io \ parsers.py”,第455行,_read       数据= parser.read(行)

     

文件“ C:\ Users \ xxxxxxxxxxxx \ AppData \ Local \ Continuum \ Anaconda3 \ envs \ test_env \ lib \ site-packages \ pandas \ io \ parsers.py”,第1069行,已读       ret = self._engine.read(nrows)

     

文件“ C:\ Users \ xxxxxxxxxxxx \ AppData \ Local \ Continuum \ Anaconda3 \ envs \ test_env \ lib \ site-packages \ pandas \ io \ parsers.py”,第1839行,已读取       数据= self._reader.read(nrows)

     

pandas._libs.parsers.TextReader.read中的文件“ pandas / _libs / parsers.pyx”,第902行

     

pandas._libs.parsers.TextReader._read_low_memory中的文件“ pandas / _libs / parsers.pyx”,第924行

     

pandas._libs.parsers.TextReader._read_rows中的文件“ pandas / _libs / parsers.pyx”,第978行

     

在pandas._libs.parsers.TextReader._tokenize_rows中的文件“ pandas / _libs / parsers.pyx”,第965行

     

pandas._libs.parsers.raise_parser_error中的文件“ pandas / _libs / parsers.pyx”,第2208行

     

pandas.errors.ParserError:标记数据时出错。 C错误:第9行中应有8个字段,看到9

我尝试过的事情:

  • 由于该错误似乎表明大熊猫存在问题,因此我尝试阅读 一张表格的单页pdf。同样的错误。
  • 将用户变量PATH设置为Java。没有改变任何东西。无法设定 系统变量PATH到Java,因为它当前用于我们的SVN 程序。
  • 不同的代码行,具有相同的错误:

    df = read_pdf(r"table_p9.pdf")
    df = read_pdf(r"table_p9.pdf")
    df = read_pdf("table_p9.pdf", output_format='json')
    

我希望有人能帮助我找出问题所在。这可能是Java问题,但是我对所需的Java交互并不熟悉。您的帮助非常有用。

修改

我尝试了不同的表,但有些表似乎正在工作。很难确定哪种类型的表起作用。有些带有“合并”列的行,而有些带有“合并”行的行似乎有效。但显然不是全部。另外,我无法使用参数multi_tables = True读取多个表(2或3)。

Tabula可以处理哪种表?这让我想知道Tabula是否适合使用正确的程序。在完成所有阅读之后,我觉得Tabula会擅长于此。它似乎要处理的表并不复杂。

是否有关于如何最大程度地使用Tabula的清晰简单的资料?或者以其他方式提示如何处理Tabula所困扰的表?

关于, 加布里埃尔

1 个答案:

答案 0 :(得分:1)

这是制表符(或制表符)选项的粗略准则。​​

1)合并单元格与行表 您可以使用lattice=True选项。在点阵模式下,表格可适当处理表格行。请注意,您可能需要后期编辑合并单元格的某种fillna。我经历过一些合并的列是用左对齐提取的。

AFAIK,表格很难提取没有表格行的合并单元格。

表格的一般调整点为latticestreamguess

2)在一个或多个页面中有多个表 这是特定于表格的选项,您必须使用multiple_tables=True选项。

默认情况下,tabula-py尝试通过CSV提取表。虽然这种方法可以从pandas.read_csv函数中受益,例如推断列名。 read_csv假定PDF中只有一个表(相同列大小的表)。列大小不同的pandas.read_csv会导致ParserError。

另一方面,使用multiple_tables选项,tabula-py通过可表示多个表的JSON创建DataFrame。

另一个选择。从tabula-py 1.3.0开始,您可以将Tabla应用程序模板与tabula-py一起使用。从模板获取区域数据,您可以通过准确的区域信息更适当地提取。