代码以及资料 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文件的更多相关文章

  1. python基础三(集合、文件)

    1.集合定义 集合天生能去重,且与字典一样,无序.集合用大括号括起来,里面的元素之间用逗号分隔,要跟字典区分开. 集合定义方法:s=set() #定义一个空集合 s={'1','a','b','c', ...

  2. 【转】Python编程: 多个PDF文件合并以及网页上自动下载PDF文件

    1. 多个PDF文件合并1.1 需求描述有时候,我们下载了多个PDF文件, 但希望能把它们合并成一个PDF文件.例如:你下载的数个PDF文件资料或者电子发票,你可以使用python程序合并成一个PDF ...

  3. 另类爬虫:从PDF文件中爬取表格数据

    简介   本文将展示一个稍微不一样点的爬虫.   以往我们的爬虫都是从网络上爬取数据,因为网页一般用HTML,CSS,JavaScript代码写成,因此,有大量成熟的技术来爬取网页中的各种数据.这次, ...

  4. PDF文件转换成Excel表格的操作技巧

    我们都知道2007以上版本的Office文档,是可以直接将文档转存为PDF格式文档的.那么反过来,PDF文档可以转换成其他格式的文档吗?这是大家都比较好奇的话题.如果可以以其他格式进行保存,就可以极大 ...

  5. 轻松将CAD文件转为加密的PDF文件

    对于从事设计相关工作的朋友来说,CAD肯定再熟悉不过了.一些有特殊要求的CAD文件,需要将其转换成为PDF文件以方便保存.传输.打印,同时还得保证设计图稿的安全性,所以将CAD文件直接转为加密的PDF ...

  6. Python数据处理PDF

    Python数据处理(高清版)PDF 百度网盘 链接:https://pan.baidu.com/s/1h8a5-iUr4mF7cVujgTSGOA 提取码:6fsl 复制这段内容后打开百度网盘手机A ...

  7. python数据处理excel和pdf,并打包成exe

    之前零散的用过一点python做数据处理,这次又遇到一个数据处理的小功能,因此,记录一下整个流程,方便以后查阅. 功能要求:读取excel,找指定的PDF文件的页数是否与excel中记录的一致 整个处 ...

  8. 深入学习Python解析并解密PDF文件内容的方法

    前面学习了解析PDF文档,并写入文档的知识,那篇文章的名字为深入学习Python解析并读取PDF文件内容的方法. 链接如下:https://www.cnblogs.com/wj-1314/p/9429 ...

  9. 深入学习python解析并读取PDF文件内容的方法

    这篇文章主要学习了python解析并读取PDF文件内容的方法,包括对学习库的应用,python2.7和python3.6中python解析PDF文件内容库的更新,包括对pdfminer库的详细解释和应 ...

随机推荐

  1. Springboot打包放到Tomcat中报错 One or more listener fail to start

    1.问题: Springboot项目直接启动不报错,打war包放到外部容器Tomcat.东方通上,在@Weblistener注解的监听器类中报错 One or more listener fail t ...

  2. 面向对象存储框架:Obase快速入门

    在项目中完成对象建模后,可以使用Obase来进行对象的管理(例如对象持久化),本篇教程将创建一个.NET Core控制台应用,来展示Obase的配置和对象的增删改查操作.本篇教程旨在指引简单入门. 本 ...

  3. 消息队列——Kafka基本使用及原理分析

    文章目录 一.什么是Kafka 二.Kafka的基本使用 1. 单机环境搭建及命令行的基本使用 2. 集群搭建 3. Java API的基本使用 三.Kafka原理浅析 1. topic和partit ...

  4. chromedp入门

    chromedp入门 chromedp是什么? chromedp是go写的,支持Chrome DevTools Protocol 的一个驱动浏览器的库.并且它不需要依赖其他的外界服务(比如 Selen ...

  5. 黎活明8天快速掌握android视频教程--21_监听ContentProvider中数据的变化

    采用ContentProvider除了可以让其他应用访问当前的app的数据之外,还有可以实现当app的数据发送变化的时候,通知注册了数据变化通知的调用者 其他所有的代码都和第20讲的一样,不同的地方看 ...

  6. Java 比较对象中的内容是否一致

    获取对象中的所有属性 private static Field[] getAllFields(Object object) { Class clazz = object.getClass(); Lis ...

  7. linux主机连接sftp报错received unexpected end-of-file from SFTP server

    SFTP 连接主机失败,提示信息如下: 登陆目标主机,编辑查看 /etc/ssh/sshd_config 文件,找到 Subsystem 关键字 替换为 Subsystem sftp internal ...

  8. 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的五种数据类 ...

  9. 推荐一种通过刷leetcode来增强技术功底的方法

    背景 如果前人认为这个一种学习提高或者检验能力的成功实践.而自己目前又没有更好的方法,那就不妨试一试. 而不管作为面试官还是被面试者,编码题最近越来越流行.而两种角色都需要思考的问题是希望考察什么能力 ...

  10. vue全家桶(4.1)

    5.状态管理 5.1.兄弟组件之间共享数据的问题? 首先,我们需要了解下兄弟组件之间如何共享数据的问题 完成下列需求: 1.点击按钮,改变商品数量 2.点击加入购物车,在购物车的这个div盒子里需要显 ...