[647]python库Camelot从pdf抽取表格数据

Camelot: 一个友好的PDF表格数据抽取工具

一个python命令行工具,使任何人都能很轻松的从PDF文件中抽取表格数据。

安装 Camelot

安装非常简单! 在安装相关的依赖后,可以直接使用pip安装。

$ pip install camelot-py

怎样使用Camelot

使用Camelot从PDF文档提取数据非常简单

image

为什么使用Camelot

  • Camelot允许你通过调整设置项来精确控制数据的提取过程
  • 可以根据空白和精度指标来判断坏的表格,并丢弃,而不必手动检查
  • 每一个表格数据是一个panda的dataframe,从而可以很方便的集成到ETL和数据分析工作流中
  • 可以把数据导出为各种不同的格式比如 CSV、JSON、EXCEL、HTML

首先,让我们看一个简单的例子:eg.pdf,整个文件只有一页,这一页中只有一个表格,如下:

9419034-4473cf94547e62f4.png

使用以下Python代码就可以提取该PDF文件中的表格:

import camelot
 
# 从PDF文件中提取表格
tables = camelot.read_pdf('E://eg.pdf', pages='1', flavor='stream')
 
# 表格信息
print(tables)
print(tables[0])
# 表格数据
print(tables[0].data)

输出结果为:

<TableList n=1>
<Table shape=(4, 4)>
[['ID', '姓名', '城市', '性别'], ['1', 'Alex', 'Shanghai', 'M'], ['2', 'Bob', 'Beijing', 'F'], ['3', 'Cook', 'New York', 'M']]

分析代码,camelot.read_pdf()为camelot的从表格中提取数据的函数,输入的参数为PDF文件的路径,页码(pages)和表格解析方法(有stream和lattice两个方法)。对于表格解析方法,默认的方法为lattice,而stream方法默认会把整个PDF页面当做一个表格来解析,如果需要指定解析页面中的区域,可以使用table_area这个参数。

camelot模块的便捷之处还在于它提供了将提取后的表格数据直接转化为pandas,csv,JSON,html的函数,如tables[0].df,tables[0].to_csv()函数等。我们以输出csv文件为例:

import camelot
 
# 从PDF文件中提取表格
tables = camelot.read_pdf('E://eg.pdf', pages='1', flavor='stream')
 
# 将表格数据转化为csv文件
tables[0].to_csv('E://eg.csv')

得到的csv文件如下:

例2

在例2中,我们将提取PDF页面中的某一区域的表格的数据。PDF文件的页面(部分)如下:

为了提取整个页面中唯一的表格,我们需要定位表格所在的位置。PDF文件的坐标系统与图片不一样,它以左下角的顶点为原点,向右为x轴,向上为y轴,可以通过以下Python代码输出整个页面的文字的坐标情况:

import camelot
 
# 从PDF中提取表格
tables = camelot.read_pdf('G://Statistics-Fundamentals-Succinctly.pdf', pages='53', \
                          flavor='stream')
 
# 绘制PDF文档的坐标,定位表格所在的位置
tables[0].plot('text')

输出结果为:

UserWarning: No tables found on page-53 [stream.py:292]

整个代码没有找到表格,这是因为stream方法默认将整个PDF页面当作表格,因此就没有找到表格。但是绘制的页面坐标的图像如下:

仔细对比之前的PDF页面,我们不难发现,表格对应的区域的左上角坐标为(50,620),右下角的坐标为(500,540)。我们在read_pdf()函数中加入table_area参数,完整的Python代码如下:

import camelot
 
# 识别指定区域中的表格数据
tables = camelot.read_pdf('G://Statistics-Fundamentals-Succinctly.pdf', pages='53', \
                          flavor='stream', table_area=['50,620,500,540'])
 
# 绘制PDF文档的坐标,定位表格所在的位置
table_df = tables[0].df
 
print(type(table_df))
print(table_df.head(n=6))

输出的结果为:

<class 'pandas.core.frame.DataFrame'>
         0               1                2           3
0  Student  Pre-test score  Post-test score  Difference
1        1              70               73           3
2        2              64               65           1
3        3              69               63          -6
4        …               …                …           …
5       34              82               88           6

总结

在具体识别PDF页面中的表格时,除了指定区域这个参数,还有上下标、单元格合并等参数,详细地使用方法可参考camelot官方文档网址:https://camelot-py.readthedocs.io/en/master/

参考:https://www.php.cn/python-tutorials-412223.html
https://mp.weixin.qq.com/s?__biz=MjM5NzU0MzU0Nw==&mid=2651380263&idx=1&sn=514485e8c4fe820834bacbcccfbb4ae9&chksm=bd2411338a539825977b2ab6d6e7a1fd86dfe0c85ba54a50d1472c309f7b1efdc164d1da4f96&mpshare=1&scene=23&srcid=0520POo6Bt0M0FUTbhnwNptJ#rd

  • 8
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

周小董

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值