小编gig*_*iga的帖子

Tabula-py 没有正确拆分列

我刚刚发现了 tabula-py(当然还有 tabula-java)从 pdf 中提取表格的乐趣。我现在正在为我的工作编写一个脚本,它从 pdf 表中读取一些数据,稍微清理一下,然后将其导出到 excel 中。我用的pdf每天都是一样的格式,表格总是在某个区域。为了检测区域,我使用 tabula.exe:我选择表格,可视化预览(看起来不错),然后导出脚本,以便查看 tabula.exe 使用的 -a 参数。然后我在我的 Python 命令中使用它,即:

df = tabula.read_pdf(os.fsdecode(directory)+filename, encoding = 'ISO-8859-1',
stream=True, area = "81.106,302.475,384.697,552.491", pages = 2, pandas_options={'header':None})
Run Code Online (Sandbox Code Playgroud)

我使用编码参数是因为标准 utf-8 返回错误,而流方法是因为它在 tabula.exe 中显示了一个很好的提取表。但是,数据框有一个问题,因为前 2 列(在 tabula.exe 的预览中正确显示为 2 个不同的列)实际上是一个单列,因此名称和值混合在一起。

你知道为什么同样的区域在 tabula-py 和 tabula.exe 中会产生 2 个不同的结果吗?非常感谢!

python pdf python-3.x tabula

5
推荐指数
1
解决办法
1万
查看次数

在 Pandas 中处理多个数据帧的优雅方式

我有一些代码目前看起来像这样:

if os.path.isfile('D:\\df_1'):
    df_1 = pd.read_pickle('D:\\df_1')
else:
    df_1 = pd.DataFrame(columns = ['Date', 'Location', 'Product'])
if os.path.isfile('D:\\df_2'):
    df_2 = pd.read_pickle('D:\\df_2')
else:
    df_2 = pd.DataFrame(columns = ['Date', 'Location', 'Product'])

[...]

if os.path.isfile('D:\\df_20'):
    df_20 = pd.read_pickle('D:\\df_20')
else:
    df_20 = pd.DataFrame(columns = ['Date', 'Location', 'Product'])
Run Code Online (Sandbox Code Playgroud)

基本上我正在做的是检查数据框是否已经存在,如果确实加载它,否则创建一个空数据框。我需要这个,因为代码将尝试将新数据附加到每个数据帧。所以我会有类似的东西:

[retrieve new data and clean it]
df_1 = pd.concat([df_1, df_1_new_data])
Run Code Online (Sandbox Code Playgroud)

对我拥有的所有 20 个数据帧执行此操作(它们包含不同的内容,因此我想将它们分开),然后保存它们以便在第二天再次检索它们并向它们添加新数据:

df_1.to_pickle('D:\\df_1')
df_2.to_pickle('D:\\df_2')
[...]
df_20.to_pickle('D:\\df_20')
Run Code Online (Sandbox Code Playgroud)

现在,使用 20 个数据帧已经相当繁重,但我可能需要添加更多数据帧!有没有办法读取不同的数据帧,然后将它们写入 for 循环中的 pickle 或类似的东西?那么,为了减少我现在的代码行数,将其减少为简单的 2 行 for 循环吗?谢谢你!

python python-3.x pandas

4
推荐指数
1
解决办法
9595
查看次数

标签 统计

python ×2

python-3.x ×2

pandas ×1

pdf ×1

tabula ×1