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

一、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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/479004.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode 561. 数组拆分 I

1. 题目 给定长度为 2n 的数组, 你的任务是将这些数分成 n 对, 例如 (a1, b1), (a2, b2), …, (an, bn) &#xff0c;使得从1 到 n 的 min(ai, bi) 总和最大。 示例 1:输入: [1,4,3,2]输出: 4 解释: n 等于 2, 最大总和为 4 min(1, 2) min(3, 4).来源&#xff1a;力扣&…

论文浅尝 - 计算机工程 | 知识图谱可视化查询技术综述

本文转载自公众号&#xff1a;计算机工程。知识图谱可视化查询技术综述王鑫, 傅强, 王林, 徐大为, 王昊奋知识图谱作为符号主义发展的产物&#xff0c;是人工智能技术和系统中的重要组成部分&#xff0c;其在百科知识、生物信息、社交网络以及网络安全等领域被广泛运用。知识图…

用VS Code直接浏览GitHub代码 | 12.1K星

文 | 金磊(发自凹非寺)源 | 量子位“看GitHub代码”这件事上&#xff0c;还在网页上点点点&#xff1f;用开发工具看代码&#xff0c;不香吗&#xff1f;于是&#xff0c;它来了&#xff0c;它来了——可以直接用VS Code方式打开GitHub代码的工具。而且在短短几天时间里&#x…

APPKIT打造稳定、灵活、高效的运营配置平台

一、背景 美团App、大众点评App都是重运营的应用。对于App里运营资源、基础配置&#xff0c;需要根据城市、版本、平台、渠道等不同的维度进行运营管理。如何在版本快速迭代过程中&#xff0c;保持运营资源能够被高效、稳定和灵活地配置&#xff0c;是我们团队面临的重大考验。…

Android官方开发文档Training系列课程中文版:通知用户之大视图通知

原文地址&#xff1a;http://android.xsoftlab.net/training/notify-user/expanded.html#big-view 通知在通知栏中以两种风格呈现&#xff1a;正常视图与大视图。只有在通知展开的时候才会展示大视图。这只有在通知处于通知栏顶部时或者用户点击了通知时才会出现。 大视图于A…

论文浅尝-WSDM | Stepwise Reasoning for Multi-Relation QA

论文笔记整理&#xff1a;谭亦鸣&#xff0c;东南大学博士。来源&#xff1a;WSDM ’20链接&#xff1a;https://dl.acm.org/doi/pdf/10.1145/3336191.33718121.介绍知识图谱问答旨在利用知识图谱的结构化信息回答以自然语言提出的问题。当面对多关系问题时&#xff0c;现有基于…

从零搭建基于知识图谱的问答系统(以医疗行业为例)

清华大学人工智能研究院院长张钹院士2020年发表署名文章&#xff0c;首次全面阐述第三代人工智能的理念&#xff0c;提出第三代人工智能的发展路径是融合第一代的知识驱动和第二代的数据驱动的人工智能。基于知识图谱的推理&#xff0c;恰恰体现了第三代人工智能的特点。知识图…

Android官方开发文档Training系列课程中文版:通知用户之在通知中显示进度

原文地址&#xff1a;http://android.xsoftlab.net/training/notify-user/display-progress.html#FixedProgress 通知中包含了一个进度指示器&#xff0c;用来向用户展示一项正在进行中的工作状态。如果你可以确保任务会花费多长时间&#xff0c;并且可以在任何时候得知它完成…

LeetCode 109. 有序链表转换二叉搜索树(快慢指针+递归)

1. 题目 给定一个单链表&#xff0c;其中的元素按升序排序&#xff0c;将其转换为高度平衡的二叉搜索树。 本题中&#xff0c;一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。 来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 链…

beeshell —— 开源的 React Native 组件库

背景 beeshell 是一个 React Native 应用的基础组件库&#xff0c;基于 0.53.3 版本&#xff0c;提供一整套开箱即用的高质量组件&#xff0c;包含 JavaScript&#xff08;以下简称 JS&#xff09;组件和复合组件&#xff08;包含 Native 代码&#xff09;&#xff0c;涉及前端…

论文浅尝 - ACL2020 | 用于链接预测的开放知识图谱嵌入

本文转载自公众号&#xff1a;PaperWeekly。 作者&#xff1a;舒意恒&#xff0c;南京大学硕士&#xff0c;研究方向&#xff1a;知识图谱。当前大量的知识图谱都是通过文本直接构建的。由于当前的知识图谱构建方法的局限性&#xff0c;其中难免包含对同一实体或关系…

论文审稿人可以下岗了?CMU都做出论文审稿机器人了!

文 | Sheryc_王苏机器学习真是越来越火了&#xff0c;这从各大会议逐年增加的投稿量上就可见一斑&#xff1a;AAAI21收到了9034篇投稿&#xff0c;NeurIPS20收到了9467篇投稿&#xff0c;一篇投稿至少要经过3位审稿人同行评议&#xff0c;耗费的人力可想而知。那么问题来了&…

Android官方开发文档Training系列课程中文版:多样屏幕之支持不同的屏幕尺寸

原文地址&#xff1a;http://android.xsoftlab.net/training/multiscreen/index.html 引言 Android运行于数以百计不同尺寸的设备上。范围小到手持移动电话&#xff0c;大到电视设备。因此&#xff0c;在设计APP时应当兼顾到尽可能多的屏幕尺寸。这样才能照顾到较多的潜在用户…

阿里云开源EasyTransfer:业界首个面向NLP场景深度迁移学习框架

阿里云开源EasyTransfer&#xff1a;业界首个面向NLP场景深度迁移学习框架 原文链接&#xff1a;https://zhuanlan.zhihu.com/p/267392773 阿里云正式开源了深度迁移学习框架 EasyTransfer&#xff0c;本文详细介绍了 EasyTransfer 框架的核心功能。机器之心发布&#xff0c;机…

LeetCode 559. N叉树的最大深度

文章目录1. 题目2. 解题2.1 递归2.2 按层queue遍历1. 题目 给定一个 N 叉树&#xff0c;找到其最大深度。 最大深度是指从根节点到最远叶子节点的最长路径上的节点总数。 2. 解题 2.1 递归 class Solution { public:int maxDepth(Node* root) {if(root NULL)return 0;int …

全链路压测平台(Quake)在美团中的实践

背景 在美团的价值观中&#xff0c;“以客户为中心”被放在一个非常重要的位置&#xff0c;所以我们对服务出现故障越来越不能容忍。特别是目前公司业务正在高速增长阶段&#xff0c;每一次故障对公司来说都是一笔非常不小的损失。而整个IT基础设施非常复杂&#xff0c;包括网络…

陈华钧等 | OpenKG区块链:构建可信开放的联邦知识图谱平台

文章导读本文介绍了OpenKG在区块链方向的一些实践和尝试。经过一年努力&#xff0c;OpenKG初步完成了底层区块链平台测试&#xff0c;以及OpenKG数据集、工具集和Openbase细粒度知识众包的上链测试工作。在这个测试平台中&#xff0c;已包含1033位确权的知识贡献者。上链测试两…

ICLR'21 | 一个二值化词向量模型,是怎么跟果蝇搭上关系的?

文&#xff5c;苏剑林&#xff08;追一科技&#xff09; 编 | 小轶可能有些读者最近会留意到ICLR 2021的论文Can a Fruit Fly Learn Word Embeddings?&#xff0c;文中写到它是基于仿生思想&#xff08;仿果蝇的嗅觉回路&#xff09;做出来的一个二值化词向量模型。其实论文的…

如何解决NLP分类任务的11个关键问题:类别不平衡低耗时计算小样本鲁棒性测试检验长文本分类 JayLou娄杰

原文链接&#xff1a;https://zhuanlan.zhihu.com/p/183852900 欢迎关注《高能AI》公众号&#xff5e;声明&#xff1a;文中观点谨代表笔者个人立场&#xff0c;盲目搬运有风险&#xff5e;在2020这个时间节点&#xff0c;对于NLP分类任务&#xff0c;我们的关注重点早已不再是…

LeetCode 908. 最小差值 I

1. 题目 给定一个整数数组 A&#xff0c;对于每个整数 A[i]&#xff0c;我们可以选择任意 x 满足 -K < x < K&#xff0c;并将 x 加到 A[i] 中。 在此过程之后&#xff0c;我们得到一些数组 B。 返回 B 的最大值和 B 的最小值之间可能存在的最小差值。 示例 1&#x…