2

我正在尝试从 PDF 中抓取数据,以便我可以重新格式化它,然后将其插入 Oracle 中的表中。我正在尝试使用 Tabula 读取 PDF 并将其转换为表格列表,但如果这些列仅包含空值,Tabula 似乎正在从表格中删除列。通常这不会是一个问题(数据一开始是“无”,所以我不关心保留它),但是在某些列上而不是在其他列上删除“空”值使得我的代码不可能以确定哪些列是哪些。例如,它可能来自:

0   1   2   3

x   x  n/a  x

x   x  n/a  x

x   x  n/a  x

0   1   2

x   x   x

x   x   x

x   x   x

在运行时无法知道要删除哪一列,所以我不能只是将它重新插入到必要的位置。

这些列在数据中没有任何唯一标识符。我不能只在最后添加一个空列,因为在列中保持相同的顺序是绝对必要的。

我研究了 Tabula API,虽然我找到了许多关于如何删除空列的方便指南,但我没有发现任何东西可以确保它们保持存在。

dflist = tabula.read_pdf(path, pages = '14-27', multiple_tables = True)
# dflist is a list of dataframes
# dflist[0] == a single dataframe

(抱歉格式不好;不熟悉堆栈溢出间距)

预期成绩:

0   1   2   3

X   NaN X   X   

X   NaN X   X   

X   NaN X   NaN

实际结果:

0   1   2

X   X   X   

X   X   X   

X   X   NaN
4

2 回答 2

1

更新:我能找到的最佳解决方案是摆弄“格子”设置,这些设置决定了如何在 Tabula 中读取表格(您可以在他们的网站上找到文档)。不幸的是,这些设置也抵消了我 PDF 上的一些行,所以我无法使用它。我不得不放弃让它完全自动化的想法,现在使用一个临时表,人工检查哪些列将被删除。

于 2019-05-29T17:36:45.467 回答
1

我遇到了同样的问题,也在 GitHub 上查看了其他示例。我认为,每当您避免阅读标题时

pandas_options={'header': None}

并且有空列,这个问题就会显现出来。我测试了它读取标题,但我的 pdf 中的列标题以自己的方式混乱,所以这不是一个真正的选择。当您设置 'columns' 和 'area' 参数时,即使没有标题,这个问题仍然应该发生,这似乎不正确。你告诉它列在哪里,如果它们是空的,它仍然会丢弃它们。这可能是白板的不足 - 确实没有什么可以确保他们保持在场。

我也正要绝望并手动完成,然后我想出了一个解决方法。

因此,就像 OP 一样,我也在阅读多个表格,实际上是数百个 pdf 页。在我的情况下,正常的列数是 9,但如果不是 9,则可以预测为 8。此外,它只发生在原始数据中的第 9 列,这是某些页面上唯一的列完全是空的。因此,对于列表中的数据框,只需添加一列 NaN,其中 tabula 未能放置:

dfs_clean = list()

for df in dflist:
    if df.shape[1] != 9:
        df[8] = np.nan 
        dfs_clean.append(df)       
        continue        
    dfs_clean.append(df)

one_df = pd.concat(dfs_clean)

这仅在它总是相同的可预测列有时为空时才有效,因此您可以以编程方式将其替换为 nans。

如果维护人员可以将此功能添加到 tabula 中,或者告诉我们如何使用它(如果它已经存在),那就更好了。Python 接口有一个java_options参数,也许你可以在里面放一些东西来做。

于 2020-04-07T22:43:23.507 回答