在线阅读后,我决定使用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
我尝试过的事情:
不同的代码行,具有相同的错误:
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所困扰的表?
关于, 加布里埃尔
答案 0 :(得分:1)
这是制表符(或制表符)选项的粗略准则。
1)合并单元格与行表
您可以使用lattice=True
选项。在点阵模式下,表格可适当处理表格行。请注意,您可能需要后期编辑合并单元格的某种fillna。我经历过一些合并的列是用左对齐提取的。
AFAIK,表格很难提取没有表格行的合并单元格。
表格的一般调整点为lattice
,stream
,guess
。
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一起使用。从模板获取区域数据,您可以通过准确的区域信息更适当地提取。