python数据处理(三)之处理pdf文件
代码以及资料 https://github.com/jackiekazil/data-wrangling
1.前言
尽可能地寻找可以替代pdf格式的数据
2.解析pdf的编程方法
安装slate
pip install slate
pip install pdfminer
2.1 利用slate库打开并读取PDF
import slate #导入slate pdf = 'EN-FINAL Table 9.pdf' # pdf文件名 with open(pdf) as f: # 打开pdf文件
doc = slate.PDF(f) # 读取pdf文件 for page in doc[:2]: # 遍历文档doc的前两页并输出
print(page)
2.2 将PDF转换成文本
转换文本代码 pdf2txt.py
pdf_txt = 'en-final-table9.txt'
openfile = open(pdf_txt, 'r')
country_line = total_line = False
previous_line = ''
countries = [] # 创建空的国家列表
totals = [] # 创建空的总数列表 double_lined_countries = [
'Bolivia (Plurinational \n',
'Democratic People\xe2\x80\x99s \n',
'Democratic Republic \n',
'Lao People\xe2\x80\x99s Democratic \n',
'Micronesia (Federated \n',
'Saint Vincent and \n',
'The former Yugoslav \n',
'United Republic \n',
'Venezuela (Bolivarian \n',
] def turn_on_off(line, status, start, prev_line, end='\n'):
"""
This function checks to see if a line starts/ends with a certain
value. If the line starts/ends with that value, the status is
set to on/off (True/False).
"""
if line.startswith(start):
status = True
elif status:
if line == end and prev_line != 'and areas':
status = False
return status def clean(line):
"""
Cleans line breaks, spaces, and special characters from our line.
"""
line = line.strip('\n').strip()
line = line.replace('\xe2\x80\x93', '-')
line = line.replace('\xe2\x80\x99', '\'')
return line for line in openfile:
if country_line: #如果包含国家则将国家添加到国家列表中
if previous_line in double_lined_countries: # 名字占两行的国家
line = ' '.join([clean(previous_line), clean(line)])
countries.append(clean(line)) elif total_line: #采集总数
if len(line.replace('\n', '').strip()) > 0:
totals.append(clean(line)) country_line = turn_on_off(line, country_line, 'and areas', previous_line)
total_line = turn_on_off(line, total_line, 'total', previous_line) previous_line = line import pprint #导入pprint库
data = dict(zip(countries, totals)) #见国家和总数合并到一起,转换成字典
pprint.pprint(data)
3 利用pdfminer解析PDF
3.1 表格中的名字被分为两条记录
a.合并两行 b.手动添加国家名
4 学习解决问题的方法
4.1 使用表格提取 pdftables
from pdftables import get_tables
import pprint headers = ['Country', 'Child Labor 2005-2012 (%) total',
'Child Labor 2005-2012 (%) male',
'Child Labor 2005-2012 (%) female',
'Child Marriage 2005-2012 (%) married by 15',
'Child Marriage 2005-2012 (%) married by 18',
'Birth registration 2005-2012 (%)',
'Female Genital mutilation 2002-2012 (prevalence), women',
'Female Genital mutilation 2002-2012 (prevalence), girls',
'Female Genital mutilation 2002-2012 (support)',
'Justification of wife beating 2005-2012 (%) male',
'Justification of wife beating 2005-2012 (%) female',
'Violent discipline 2005-2012 (%) total',
'Violent discipline 2005-2012 (%) male',
'Violent discipline 2005-2012 (%) female'] all_tables = get_tables(open('EN-FINAL Table 9.pdf', 'rb')) first_name = False
final_data = [] for table in all_tables:
for row in table[5:]:
if row[0] == '' or row[0][0].isdigit(): # 如果是空行或为数据 不是国名
continue
elif row[2] == '': # 缺失 可能是国名的前半部分
first_name = row[0]
continue
if first_name: # 如果这一行有first_name, 那么在该行内将国名合并
row[0] = u'{} {}'.format(first_name, row[0])
first_name = False # 保证下一次迭代正常运行 final_data.append(dict(zip(headers, row))) if row[0] == 'Zimbabwe':
break pprint.pprint(final_data)
4.2 手动清洗数据
4.3 使用Tabula
python数据处理(三)之处理pdf文件的更多相关文章
- python基础三(集合、文件)
1.集合定义 集合天生能去重,且与字典一样,无序.集合用大括号括起来,里面的元素之间用逗号分隔,要跟字典区分开. 集合定义方法:s=set() #定义一个空集合 s={'1','a','b','c', ...
- 【转】Python编程: 多个PDF文件合并以及网页上自动下载PDF文件
1. 多个PDF文件合并1.1 需求描述有时候,我们下载了多个PDF文件, 但希望能把它们合并成一个PDF文件.例如:你下载的数个PDF文件资料或者电子发票,你可以使用python程序合并成一个PDF ...
- 另类爬虫:从PDF文件中爬取表格数据
简介 本文将展示一个稍微不一样点的爬虫. 以往我们的爬虫都是从网络上爬取数据,因为网页一般用HTML,CSS,JavaScript代码写成,因此,有大量成熟的技术来爬取网页中的各种数据.这次, ...
- PDF文件转换成Excel表格的操作技巧
我们都知道2007以上版本的Office文档,是可以直接将文档转存为PDF格式文档的.那么反过来,PDF文档可以转换成其他格式的文档吗?这是大家都比较好奇的话题.如果可以以其他格式进行保存,就可以极大 ...
- 轻松将CAD文件转为加密的PDF文件
对于从事设计相关工作的朋友来说,CAD肯定再熟悉不过了.一些有特殊要求的CAD文件,需要将其转换成为PDF文件以方便保存.传输.打印,同时还得保证设计图稿的安全性,所以将CAD文件直接转为加密的PDF ...
- Python数据处理PDF
Python数据处理(高清版)PDF 百度网盘 链接:https://pan.baidu.com/s/1h8a5-iUr4mF7cVujgTSGOA 提取码:6fsl 复制这段内容后打开百度网盘手机A ...
- python数据处理excel和pdf,并打包成exe
之前零散的用过一点python做数据处理,这次又遇到一个数据处理的小功能,因此,记录一下整个流程,方便以后查阅. 功能要求:读取excel,找指定的PDF文件的页数是否与excel中记录的一致 整个处 ...
- 深入学习Python解析并解密PDF文件内容的方法
前面学习了解析PDF文档,并写入文档的知识,那篇文章的名字为深入学习Python解析并读取PDF文件内容的方法. 链接如下:https://www.cnblogs.com/wj-1314/p/9429 ...
- 深入学习python解析并读取PDF文件内容的方法
这篇文章主要学习了python解析并读取PDF文件内容的方法,包括对学习库的应用,python2.7和python3.6中python解析PDF文件内容库的更新,包括对pdfminer库的详细解释和应 ...
随机推荐
- Springboot打包放到Tomcat中报错 One or more listener fail to start
1.问题: Springboot项目直接启动不报错,打war包放到外部容器Tomcat.东方通上,在@Weblistener注解的监听器类中报错 One or more listener fail t ...
- 面向对象存储框架:Obase快速入门
在项目中完成对象建模后,可以使用Obase来进行对象的管理(例如对象持久化),本篇教程将创建一个.NET Core控制台应用,来展示Obase的配置和对象的增删改查操作.本篇教程旨在指引简单入门. 本 ...
- 消息队列——Kafka基本使用及原理分析
文章目录 一.什么是Kafka 二.Kafka的基本使用 1. 单机环境搭建及命令行的基本使用 2. 集群搭建 3. Java API的基本使用 三.Kafka原理浅析 1. topic和partit ...
- chromedp入门
chromedp入门 chromedp是什么? chromedp是go写的,支持Chrome DevTools Protocol 的一个驱动浏览器的库.并且它不需要依赖其他的外界服务(比如 Selen ...
- 黎活明8天快速掌握android视频教程--21_监听ContentProvider中数据的变化
采用ContentProvider除了可以让其他应用访问当前的app的数据之外,还有可以实现当app的数据发送变化的时候,通知注册了数据变化通知的调用者 其他所有的代码都和第20讲的一样,不同的地方看 ...
- Java 比较对象中的内容是否一致
获取对象中的所有属性 private static Field[] getAllFields(Object object) { Class clazz = object.getClass(); Lis ...
- linux主机连接sftp报错received unexpected end-of-file from SFTP server
SFTP 连接主机失败,提示信息如下: 登陆目标主机,编辑查看 /etc/ssh/sshd_config 文件,找到 Subsystem 关键字 替换为 Subsystem sftp internal ...
- Redis五种数据类型应用场景
目录 1.1 回顾 2.1 应用场景 2.1.1 String 2.1.2 Hash 2.1.3 List 2.1.4 Zet 2.1.5 zset 3.1 小结 1.1 回顾 Redis的五种数据类 ...
- 推荐一种通过刷leetcode来增强技术功底的方法
背景 如果前人认为这个一种学习提高或者检验能力的成功实践.而自己目前又没有更好的方法,那就不妨试一试. 而不管作为面试官还是被面试者,编码题最近越来越流行.而两种角色都需要思考的问题是希望考察什么能力 ...
- vue全家桶(4.1)
5.状态管理 5.1.兄弟组件之间共享数据的问题? 首先,我们需要了解下兄弟组件之间如何共享数据的问题 完成下列需求: 1.点击按钮,改变商品数量 2.点击加入购物车,在购物车的这个div盒子里需要显 ...