代码以及资料 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. 微信小程序公司开发前必读

    事前准备: 微信小程序需要https请求,需要准备 1:备案的域名:由于备案需要一定的时间,所以请事先准备 2:受认可的证书 一个账号只能发布一个小程序,如需发布多个,请申请多个账号. 个人开发和学习 ...

  2. SDL2 gif动态图加载

    参照 https://tieba.baidu.com/p/3569073088?tpl=5&red_tag=1777318765 使用mingw工具链 #include <stdbool ...

  3. sublime Text3 实现2:1:1三分屏效果

    小trick, 水一篇博客 先上效果图 由于写题啥的时候需要重定向输入输出改数据对拍, 设置成这样的效果就非常直观的看数据 直接切题, 首选项--快捷键--default里搜索alt+shift+1( ...

  4. TensorFlow从0到1之矩阵基本操作及其实现(7)

    矩阵运算,例如执行乘法.加法和减法,是任何神经网络中信号传播的重要操作.通常在计算中需要随机矩阵.零矩阵.一矩阵或者单位矩阵. 本节将告诉你如何获得不同类型的矩阵,以及如何对它们进行不同的矩阵处理操作 ...

  5. 东方步进电机马达驱动板CVK系列说明书

    东方步进电机马达驱动板CVK系列说明书

  6. cb09a_c++_顺序容器的操作2-在顺序容器中添加元素_插入数据

    cb09a_c++_顺序容器的操作2在顺序容器中添加元素vector不能向前插入数据,list可以用insertc.push_back(t);c.push_front(t);c.insert(p,t) ...

  7. Beta冲刺<7/10>

    这个作业属于哪个课程 软件工程 (福州大学至诚学院 - 计算机工程系) 这个作业要求在哪里 Beta冲刺 这个作业的目标 Beta冲刺--第七天(05.25) 作业正文 如下 其他参考文献 ... B ...

  8. 12.DRF-节流

    Django rest framework源码分析(3)----节流 添加节流 自定义节流的方法 限制60s内只能访问3次 (1)API文件夹下面新建throttle.py,代码如下: # utils ...

  9. SpringCloud教程第4篇:Hystrix(F版本)

    在微服务架构中,根据业务来拆分成一个个的服务,服务与服务之间可以相互调用(RPC),在Spring Cloud可以用RestTemplate+Ribbon和Feign来调用.为了保证其高可用,单个服务 ...

  10. 二叉查找树、平衡二叉树(AVLTree)、平衡多路查找树(B-Tree),B+树

    B+树索引是B+树在数据库中的一种实现,是最常见也是数据库中使用最为频繁的一种索引. B+树中的B代表平衡(balance),而不是二叉(binary),因为B+树是从最早的平衡二叉树演化而来的. 在 ...