我正在尝试从PDF抓取数据,以便可以重新格式化它,然后将其插入Oracle中的表中。我正在尝试使用Tabula读取PDF并将其转换为表列表,但是Tabula似乎是从表中删除列,如果这些列仅包含空值。 通常这不是问题(数据从无到有,因此我不在乎保存),但是在某些列而不是其他列上删除“ null”值会使我的代码无法实现确定哪些列是哪些。 例如,它可能来自:
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
答案 0 :(得分:0)
更新:我能找到的最好的解决方案是摆弄“格子”设置,该设置确定如何在Tabula中读取表(可以在其站点上找到文档)。 不幸的是,这些设置也偏移了我PDF上的某些行,因此我无法使用它。我不得不放弃使它完全自动化的想法,现在使用一个临时表,由人工检查哪些列将被删除。
答案 1 :(得分:0)
我遇到了同样的问题,还在GitHub上查看了其他示例。我认为只要您避免使用
读取标题pandas_options={'header': None}
并且有空列,此问题将显现。我测试了它读取标题,但是pdf中各列的标题以它们自己的方式是混乱的,因此这并不是一个选择。设置“ columns”和“ area”参数时,即使没有标题,该问题也应 静止 发生,这似乎并不正确。您可以准确地告诉它列的位置,如果它们为空,它仍然会丢弃它们。可能是表格的不足-确实没有什么可以确保他们留在现场。
我也将绝望并手动进行操作,然后我想出了一种解决方法。
因此,像OP一样,我也在读取多个表,实际上是数百个pdf页面。在我的情况下,正常的列数是9,但如果不是9,则可以预见的是8。此外,它仅在原始数据中的第9列发生过,这是某些页面上唯一的列完全空了。因此,对于列表中的数据框,只需将其固定在NaN的一列中,表格不能放在其中:
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。
如果维护人员可以将此功能添加到表格中,或者告诉我们如何使用它(如果已经存在)会更好。 Python介面有一个java_options
参数,也许您可以在其中放置一些参数。