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库的详细解释和应 ...
随机推荐
- 如何在Vim中的查找替换
“%s/最/第二/g” 用vim的人都知道,这是把所有“最”替换成“第二”的意思.其实vim的查找替换功能非常强大,用的好可以极大提升效率. vim的查找替换命令如下所示: :{作用范围}s/{ ...
- Windows下C,C++开发环境搭建指南
Windows下C,C++开发环境搭建指南 前情提要 基于近一段时间很多网友发邮件反馈,说一些项目编译出现问题,诸如此类的情况. 就觉得很有必要写一篇C,C++开发环境的小指南,统一回复. 1.君欲善 ...
- (十)HttpClient以multipart/form-data上传文件
原文链接:https://blog.csdn.net/wsdtq123/article/details/78888734 POST上传文件 最早的HTTP POST是不支持文件上传的,给编程开发带来很 ...
- APP自动化1——Appium+pycharm自动化环境搭建全流程
1. 安装python3,pycharm,可参考之前写的文档:https://www.cnblogs.com/chenweitoag/p/13154815.html 2. 准备以下必要工具: 基于wi ...
- 浅谈RegExp 对象的方法
JavaScript RegExp 对象有 3 个方法:test().exec() 和 compile().(1) test() 方法用来检测一个字符串是否匹配某个正则表达式,如果匹配成功,返回 tr ...
- 如何在VMware虚拟机中安装CentOS6.7系统(上篇)
之前给大家分享了在VMware中如何创建CentOS虚拟机,今天给大家分享一下如何在虚拟机中安装CentOS系统,以CentOS6.7系统为例,其他的系统版本也可以参考该教程进行类似处理,具体的流程如 ...
- skynet 初步分析
自己想实现一个tcp 粘包,残包的功能. 先看看一些开源的库是怎么实现的. 首先开启一个线程.使劲的执行: skynet_socket_poll skynet_socket_poll 这个玩意是干 ...
- 这一次搞懂Spring Web零xml配置原理以及父子容器关系
前言 在使用Spring和SpringMVC的老版本进行开发时,我们需要配置很多的xml文件,非常的繁琐,总是让用户自行选择配置也是非常不好的.基于约定大于配置的规定,Spring提供了很多注解帮助我 ...
- Windows安装C的编译环境
对于java开发者来说安装C的编译环境不是非常熟悉,因此本文对C的安装环境进行介绍以及windows编译Redis和Zookeeper的过程.MinGW主要用于按照gcc.make等环境,cywin用 ...
- 手机商品分享样式(纯html+css)
效果图: html: <!DOCTYPE html> <html lang="en"> <head> <meta charset= ...