python库Camelot从pdf抽取表格数据以及python库camelot安装及使用中的一些注意事项

2023-11-19

一、python库camelot安装及使用中的一些注意事项

1)camelot方法有两种解析模式:流解析(stream)、格子解析(lattice),其中格子解析能够保留表格完整的样式,对于复杂表格来说要优于流解析模式。同时,camelot方法默认格子解析(lattice),而采用这种解析方式,需要安装ghostscript。因此,仅通过pip命令安装的camelot,代码运行时通常会报错。需要下载ghostscript.exe并安装。安装后,经测试,并不需要在代码中import ghostscript。

2)camelot输出格式如果选择csv格式,可能存在中文乱码问题,需要用文本编辑器将导出的csv文件编码改为ansi格式。
如果想直接保存为excel格式,需要xlwt模块支持,pip安装xlwt后tables.export(‘文件名.xls’,f = ‘excel’)即可输出为excel格式。

3)后来在另外一台电脑上安装camelot库时出现了一个奇葩的问题,程序运行报错。反复检查才发现原因。首先是在这台电脑上,我是按照印象输入pip install camelot,也安装成功。但代码运行错误。经查阅,正确命令(或者说版本)是pip install camelot-py[cv]。

所以我先uninstall前面安装的camelot,又重新按照正确的命令安装camelot-py[cv],但代码运行时又提示import xlwt有问题,在python库中检查了下,xlwt文件是正常的,找了半天没找到原因。后来单独卸载xlwt,然后重新pip安装xlwt,发现xlwt的版本号由0.7变为1.3,然后一切就正常了。估计是之前错误安装了camelot的版本,导致顺带安装的xlwt版本过低,无法兼容python3.6.5。

4)camelot开始时一切正常,但处理一个pdf文件时突然报错:pdfminer.psparser.SyntaxError: Invalid dictionary construct: [/‘Type’, /‘Font’, /‘Subtype’, /‘Type0’, /‘BaseFont’, /b"b’", /“ABCDEE+\xcb\xce\xcc\xe5’”, /‘Encoding’, /‘Identity-H’, /‘DescendantFonts’, PDFObjRef:11, /‘ToUnicode’, PDFObjRef:19]

经百度,找到解决方案,修改了pandas和PyPDF2模块的三处源码,恢复正常。具体修改内容见python爬虫处理在线预览的pdf文档https://link.csdn.net/?target=https%3A%2F%2Fwww.cnblogs.com%2FEeyhan%2Farchive%2F2019%2F12%2F30%2F12111371.html

二 、 python库Camelot从pdf抽取表格数据
原文链接:https://blog.csdn.net/xc_zhou/article/details/99242995

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

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

安装 Camelot

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

$ pip install camelot-py

  
  
  
  
  • 1

怎样使用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)

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

输出结果为:

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

 
 
 
 
  • 1
  • 2
  • 3

分析代码,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’)

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

得到的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’)

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

输出结果为:

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

 
 
 
 
  • 1

整个代码没有找到表格,这是因为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))

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

输出的结果为:

<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

 
 
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

总结

在具体识别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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python库Camelot从pdf抽取表格数据以及python库camelot安装及使用中的一些注意事项 的相关文章

随机推荐

  • C/C++字符变量无法显示的问题

    快要找工作了 最近在狂看 程序员面试宝典 第二版 中间有个题目 作者解释错了 更重要的是 里面有个细节 导致我弄了好久才搞懂 现在拿出来分享下 下面是书中P37的源代码 面试例题1 下面程序的输出结果是多少 include
  • 从零开始的Docker详解(五)

    Docker容器互联 简介 docker可以定义一个连接系统将多个容器都连接在一起 共享连接信息 docker链接会创建一个父子关系 其中父容器可以看到子容器的信息 新建网络 使用命令docker network ls来查看当前已有的doc
  • 微信小程序从后台拿数据并成功展示到前台——demo

    项目结构 我没有使用index文件夹 使用了自己创建的test文件夹 1 创建好页面之后配置app json 2 前台页面 3 页面的js 4 页面展示效果 5 后台代码 一开始还想自己进行json转换 发现有线程的注解可以使用达到对象和j
  • tf好朋友之matplotlib的使用——annotate标注的使用

    tf好朋友之matplotlib的使用 annotate标注的使用 标注常用函数及其作用 1 plt annotate 2 plt text 应用示例 标注常用函数及其作用 1 plt annotate plt annotate s xy
  • 【Git】Github 上传文件常见的几种错误及尝试的解决方法

    文章目录 一 分支引发的错误 二 经常性的网络引发的错误 三 没有找到名为 HEAD 的引用 四 无法识别远程仓库 一 分支引发的错误 具体的错误类型为 error failed to push some refs to https git
  • 【软件测试】Requests库中处理cookie的几种方式

    前言 发送请求时经常需要利用请求头中的cookie字段来做用户访问状态的保持 关于的cookie的处理常见有下面一些处理方式 这里做个小小的总结 1 直接在请求中传递cookies参数 import requests host http 1
  • [163]星号密码探测工具 - 代码远程线程注入的简单运用

    忙里偷闲 在看雪论坛上面看到有人发布了一个 Win7星号密码探测工具 发现 有那么一点 小用处 用处不大的原因是 这个程序的的能力相当有限 只能查看一部分安全性不高的软件的密码框里面的程序 如果你要拿它来看QQ的密码 想当然 那是不可能了
  • printf怎么输出? 如何正确使用%s,%c,%d,%p?=>这篇详解用法

    printf怎么输出 gt 如何正确使用 s c d p d试例 include
  • jquery 全国 三联 地址选择

    https www jq22 com demo jquery jdxz20160902
  • 中文命名实体识别

    中文命名实体识别 1 语言技术平台 LTP 2 Pyhanlp 3 BosonNLP 1 语言技术平台 LTP LTP官方地址 语言技术平台 Language Technology Plantform 要想用LTP实现中文命名实体识别非常简
  • JAVA基础06方法

    6 方法 方法可以用于定义可重用的代码以及组织和简化编码 6 1 定义方法 方法的定义由方法名称 参数 返回值类型以及方法体组成 定义方法的语法如下所示 修饰符 返回值类型 方法名 参数列表 方法体 我们一起来看一个方法的定义 该方法找出两
  • Normalizing Flows (NF) - 流模型 - 研究方向

    Normalizing Flows An Introduction and Review of Current Methods 2020 TPAMI Open problems and possible research direction
  • K8S暴露端口-dubbo应用远程Debug

    1 Dockerfile增加环境变量 ENV JAVA OPTS Xdebug Xrunjdwp transport dt socket address 9901 server y suspend n 2 暴露端口 template ser
  • Spring的两种IOC容器

    文章目录 Spring IOC容器 BeanFactory 怎样创建BeanFactory BeanFactory中的方法 ApplicationContext 几种ApplicationContext 如何创建ApplicationCon
  • 安装batocera-linux教程_batocera游戏系统,一个U盘搞定所有模拟器

    本帖最后由 仙鬼同拥 于 2020 5 10 09 57 编辑 去年有人发过一个求助帖找这个模拟器系统 今天有人私信说链接打不开了 就自己开一贴说一下下载安装过程吧 原求助帖地址https www 52pojie cn thread 994
  • STM32 高级定时器周期、频率、占空比、对外输出电压详解

    STM32 高级定时器 最近在研究电机 对TIM定时器研究了一些 将一些存在疑惑的问题 通过试验和示波器分析 得到以下结论 供大家学习参考 1 介绍输出电压高低判断 输出比较时 OC1对外输出电压为示波器可以读取的电压 也是我们最终使用的电
  • c语言 凯撒加密

    为了防止信息被别人轻易窃取 需要把电码明文通过加密方式变换成为密文 输入一个以回车符为结束标志的字符串 少于80个字符 再输入一个整数offset 用凯撒密码将其加密后输出 恺撒密码是一种简单的替换加密技术 将明文中的所有字母都在字母表上偏
  • 解决Docker容器中Mysql中文乱码问题

    进入容器 修改 etc mysql my cnf 添加如下配置 client port 3306 socket var lib mysql mysql sock default character set utf8 mysqld port
  • Microsoft Office 2010安装

    哈喽 大家好 今天一起学习的是office2010的安装 有兴趣的小伙伴也可以来一起试试手 一 测试演示参数 演示操作系统 Windows 7 不建议win10及以上操作系统使用 系统类型 64位 演示版本 SW DVD5 Office P
  • python库Camelot从pdf抽取表格数据以及python库camelot安装及使用中的一些注意事项

    一 python库camelot安装及使用中的一些注意事项 1 camelot方法有两种解析模式 流解析 stream 格子解析 lattice 其中格子解析能够保留表格完整的样式 对于复杂表格来说要优于流解析模式 同时 camelot方法