代码以及资料 https://github.com/jackiekazil/data-wrangling

1.前言

尽可能地寻找可以替代pdf格式的数据

2.解析pdf的编程方法

安装slate

  1. pip install slate
    pip install pdfminer

2.1 利用slate库打开并读取PDF

  1. import slate #导入slate
  2.  
  3. pdf = 'EN-FINAL Table 9.pdf' # pdf文件名
  4.  
  5. with open(pdf) as f: # 打开pdf文件
  6. doc = slate.PDF(f) # 读取pdf文件
  7.  
  8. for page in doc[:2]: # 遍历文档doc的前两页并输出
  9. print(page)

2.2 将PDF转换成文本

转换文本代码 pdf2txt.py

  1. pdf_txt = 'en-final-table9.txt'
  2. openfile = open(pdf_txt, 'r')
  3. country_line = total_line = False
  4. previous_line = ''
  5. countries = [] # 创建空的国家列表
  6. totals = [] # 创建空的总数列表
  7.  
  8. double_lined_countries = [
  9. 'Bolivia (Plurinational \n',
  10. 'Democratic People\xe2\x80\x99s \n',
  11. 'Democratic Republic \n',
  12. 'Lao People\xe2\x80\x99s Democratic \n',
  13. 'Micronesia (Federated \n',
  14. 'Saint Vincent and \n',
  15. 'The former Yugoslav \n',
  16. 'United Republic \n',
  17. 'Venezuela (Bolivarian \n',
  18. ]
  19.  
  20. def turn_on_off(line, status, start, prev_line, end='\n'):
  21. """
  22. This function checks to see if a line starts/ends with a certain
  23. value. If the line starts/ends with that value, the status is
  24. set to on/off (True/False).
  25. """
  26. if line.startswith(start):
  27. status = True
  28. elif status:
  29. if line == end and prev_line != 'and areas':
  30. status = False
  31. return status
  32.  
  33. def clean(line):
  34. """
  35. Cleans line breaks, spaces, and special characters from our line.
  36. """
  37. line = line.strip('\n').strip()
  38. line = line.replace('\xe2\x80\x93', '-')
  39. line = line.replace('\xe2\x80\x99', '\'')
  40. return line
  41.  
  42. for line in openfile:
  43. if country_line: #如果包含国家则将国家添加到国家列表中
  44. if previous_line in double_lined_countries: # 名字占两行的国家
  45. line = ' '.join([clean(previous_line), clean(line)])
  46. countries.append(clean(line))
  47.  
  48. elif total_line: #采集总数
  49. if len(line.replace('\n', '').strip()) > 0:
  50. totals.append(clean(line))
  51.  
  52. country_line = turn_on_off(line, country_line, 'and areas', previous_line)
  53. total_line = turn_on_off(line, total_line, 'total', previous_line)
  54.  
  55. previous_line = line
  56.  
  57. import pprint #导入pprint库
  58. data = dict(zip(countries, totals)) #见国家和总数合并到一起,转换成字典
  59. pprint.pprint(data)

3 利用pdfminer解析PDF

3.1 表格中的名字被分为两条记录

a.合并两行  b.手动添加国家名

4 学习解决问题的方法

4.1 使用表格提取 pdftables

  1. from pdftables import get_tables
  2. import pprint
  3.  
  4. headers = ['Country', 'Child Labor 2005-2012 (%) total',
  5. 'Child Labor 2005-2012 (%) male',
  6. 'Child Labor 2005-2012 (%) female',
  7. 'Child Marriage 2005-2012 (%) married by 15',
  8. 'Child Marriage 2005-2012 (%) married by 18',
  9. 'Birth registration 2005-2012 (%)',
  10. 'Female Genital mutilation 2002-2012 (prevalence), women',
  11. 'Female Genital mutilation 2002-2012 (prevalence), girls',
  12. 'Female Genital mutilation 2002-2012 (support)',
  13. 'Justification of wife beating 2005-2012 (%) male',
  14. 'Justification of wife beating 2005-2012 (%) female',
  15. 'Violent discipline 2005-2012 (%) total',
  16. 'Violent discipline 2005-2012 (%) male',
  17. 'Violent discipline 2005-2012 (%) female']
  18.  
  19. all_tables = get_tables(open('EN-FINAL Table 9.pdf', 'rb'))
  20.  
  21. first_name = False
  22. final_data = []
  23.  
  24. for table in all_tables:
  25. for row in table[5:]:
  26. if row[0] == '' or row[0][0].isdigit(): # 如果是空行或为数据 不是国名
  27. continue
  28. elif row[2] == '': # 缺失 可能是国名的前半部分
  29. first_name = row[0]
  30. continue
  31. if first_name: # 如果这一行有first_name, 那么在该行内将国名合并
  32. row[0] = u'{} {}'.format(first_name, row[0])
  33. first_name = False # 保证下一次迭代正常运行
  34.  
  35. final_data.append(dict(zip(headers, row)))
  36.  
  37. if row[0] == 'Zimbabwe':
  38. break
  39.  
  40. 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. [转] 浅谈C++中的那些内存泄露

    点击阅读原文 尽管学过C语言.可是C++里面的一些基础还是不太懂,还须要再掌握. 对于内存泄露,我的个人理解就是程序在执行过程中,自己开辟了空间,用完这块空间后却没有释放. 今晚上我就犯了这种低级错误 ...

  2. Ultra-QuickSort (求逆序数+离散化处理)、Cows、Stars【树状数组】

    一.Ultra-QuickSort(树状数组求逆序数) 题目链接(点击) Ultra-QuickSort Time Limit: 7000MS   Memory Limit: 65536K Total ...

  3. 一文带你了解Redis持久化完整版本

    本文讲解知识点 持久化的简介 RDB AOF RDB与AOF的区别 持久化应用场景 对于持久化这个功能点,其实很简单没有那么复杂 演示环境 centos7.0 redis4.0 redis存放目录:/ ...

  4. 三文搞懂学会Docker容器技术(中)

    接着上面一篇:三文搞懂学会Docker容器技术(上) 6,Docker容器 6.1 创建并启动容器 docker run [OPTIONS] IMAGE [COMMAND] [ARG...] --na ...

  5. 位运算实现加减乘除四则运算(Java)

    [本文版权归微信公众号"代码艺术"(ID:onblog)所有,若是转载请务必保留本段原创声明,违者必究.若是文章有不足之处,欢迎关注微信公众号私信与我进行交流!] 本文是继< ...

  6. 深拷贝和浅拷贝以及void里的return用法

    Object o1=new Object(); Object o2; int i1=3,i2; 浅拷贝 o2=o1;i2=i1; 深拷贝 o2=new Object();o2=o1.clone(); ...

  7. Hystrix总结

    Hystrix 能使你的系统在出现依赖服务失效的时候,通过隔离系统所依赖的服务,防止服务级联失败,同时提供失败回退机制,更优雅地应对失效,并使你的系统能更快地从异常中恢复. Hystrix能做什么? ...

  8. java-递归(文件查找)

    import java.io.File; /** * @Author: heq * @Date: 2020/6/23 20:51 */ public class Test { public stati ...

  9. openstack Rocky 社区版部署1.4 安装数据库

    在控制节点安装mariadb,也可以单独服务器安装数据库,假如多个控制节点就在第一台安装数据库,计算节点不需要安装. 1 安装mariadb相关安装包. yum install mariadb mar ...

  10. MFC线程(二):线程同步临界区CRITICAL SECTION

    当多个线程同时使用相同的资源时,由于是并发执行,不能保证先后顺序.所以假如时一个公共变量被几个线程同时使用会造成该变量值的混乱. 下面来举个简单例子. 假如有一个字符数组变量 char g_charA ...