Python读取pdf表格写入excel的方法


Posted in Python onJanuary 22, 2021

背景

今天突然想到之前被要求做同性质银行的数据分析。妈耶!十几个银行,每个银行近5年的财务数据,而且财务报表一般都是 pdf 的,我们将 pdf 中表的数据一个个的拷贝到 excel 中,再借助 excel 去进行求和求平均等聚合函数操作,完事了还得把求出来的结果再统一 CV 到另一张表中,进行可视化分析…

当然,那时风流倜傥的 老Amy 还熟练的玩转着 excel ,也是个秀儿~ 今天就思索着,如果当年我会 Python 是不是可以让我成为班级最靓的崽!用技术占领高地,HHH,所以今天我来了,希望可以帮助大家解决同性质的问题。

开始学习叭

避免CV大法

pdf 文件的表格的数据可以复制,但是这是一项非常繁琐的事情。所以我首先考虑的是,Python 可否帮助我们高效且规范地读取 pdf 中的表格数据。所以一顿的检索,发现了一个比较优质处理 pdf 的库:pdfplumber,当然这个库需要大家 pip install pdfplumber 去进行安装。以及详细使用可参考全球最大基友社区:https://github.com/jsvine/pdfplumber

步骤:

  • 导入 pdfplumber 库
  • 通过 pdfplumber.open() 函数 获取 mt2018.pdf 文件对象
  • 通过该 对象.pages 获取 pdf 每页的对象,截取我们需要的页对象即可
  • 通过 页对象.extract_tables() 获取表格数据(若需要获取文本:页对象.extract_text())

代码实现:

import pdfplumber


# 获取 pdf 文件对象
pdf_mt = pdfplumber.open("mt2018.pdf")

# 因为我需要获取的资产负债表在 51-53页 但是索引从0开始 所以切片取 50-52即可
for pdf_pg in pdf_mt.pages[50:53]:
  
  # 只提取当前页表格数据 
  print(pdf_pg.extract_tables())
  
  
--------------------------------------------------------------------------
结果比较多,截取一部分:
[[['项目', '附注', '期末余额', '期初余额'], ['流动资产:', '', '', ''], ['货币资金', '1', '112,074,791,420.06', '87,868,869,913.34'], ['结算备付金', '', '', ''], ['拆出资金', '', '', ''], ['以公允价值计量且其变动计入当\n期损益的金融资产', '', '', ''], ['衍生金融资产', '', '', ''], ['应收票据及应收账款', '2', '563,739,710.00', '1,221,706,039.00']]]

将完整表保存到 csv 文件中

我们发现,返回的数据集是一个三维的列表。那么在我们平时处理的 excel 表格数据(行与列)都是二维的数据。那么,这多出的一维是什么呢?其实就是我们的夜[页]~ 再来一个循环取出二维数据进行保存即可

for pdf_pg in pdf_mt.pages[50:53]:
  for pdf_tb in pdf_pg.extract_tables():
    print(pdf_tb)
    
------------------------------------------------------------------------------
结果比较多,截取一部分:
[['项目', '附注', '期末余额', '期初余额'], ['流动资产:', '', '', ''], ['货币资金', '1', '112,074,791,420.06', '87,868,869,913.34'], ['结算备付金', '', '', ''], ['拆出资金', '', '', ''], ['以公允价值计量且其变动计入当\n期损益的金融资产', '', '', ''], ['衍生金融资产', '', '', ''], ['应收票据及应收账款', '2', '563,739,710.00', '1,221,706,039.00']]

但是,真的那么简单吗?这时,我们就需要细品我们的 pdf 了,如下图

Python读取pdf表格写入excel的方法

我们发现,一张完整的资产负债表分布在多页上。也就是说,每一页的里面的表格数据都是一个三维的列表,所以我们保存数据的时候,需要让其有共同的表头(列索引),并且进行拼接。

那必须就要强推我们的 pandas 了,pandas.DataFrame() 非常完美的创建表格式的二维数组,以及指定列索引(表头)。包括可以直接 使用 df.append() 进行共同表头数据的堆叠拼接。

import pdfplumber
import pandas as pd
import numpy as np

# 创建仅有表头的 dataframe 数组
pdf_df = pd.DataFrame(columns=['项目', '附注', '期末余额', '期初余额'])

# 获取 pdf 文件对象
pdf_mt = pdfplumber.open("mt2018.pdf")

# 因为我需要获取的资产负债表在 51-53页 但是索引从0开始 所以切片取 50-52即可
for pdf_pg in pdf_mt.pages[50:53]:
  
  # 获取二维列表
  for pdf_tb in pdf_pg.extract_tables():
    
    # 将其拼接
    pdf_df = pdf_df.append(pd.DataFrame(np.array(pdf_tb),columns=['项目', '附注', '期末余额', '期初余额']))

# 显示后五条
pdf_df.tail()

dataframe数据输出如下:

Python读取pdf表格写入excel的方法

pdf 53页如下:

Python读取pdf表格写入excel的方法

实际上,大家也发现,我们获取的最后一页的数据还有一部分是另一个表的,所以我们需要将其去除,并且有序的设置行索引,再保存到 csv 文件中。

# 去除后三行
pdf_df = pdf_df.iloc[:-3,:]

# 重置索引
pdf_df = pdf_df.reset_index(drop=True)

# 保存到 csv 文件中
pdf_df.to_csv("mt_2018.csv")

Python读取pdf表格写入excel的方法

当然,今天就到这里,其它的需求我们下次给大家完善。大家也可以自己将代码封装成函数,这样就可以实现传入 pdf文件名称、页数以及保存的文件名来复用代码。如果大家再掌握了 pandas 就可以根据自己的需求,对各个表格数据进行处理。再结合 seaborn 绘图可视化,完爆 excel ~ 快学习起来叭,GOGOGO

以上就是Python读取pdf表格写入excel的方法的详细内容,更多关于Python读取pdf表格写入excel的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
Python实现将数据写入netCDF4中的方法示例
Aug 30 Python
使用Python制作简单的小程序IP查看器功能
Apr 16 Python
Python完成毫秒级抢淘宝大单功能
Jun 06 Python
Python re 模块findall() 函数返回值展现方式解析
Aug 09 Python
Python简易版停车管理系统
Aug 12 Python
tensorflow 初始化未初始化的变量实例
Feb 06 Python
python GUI库图形界面开发之PyQt5控件数据拖曳Drag与Drop详细使用方法与实例
Feb 27 Python
python 函数嵌套及多函数共同运行知识点讲解
Mar 03 Python
python代码实现将列表中重复元素之间的内容全部滤除
May 22 Python
Python实现计算图像RGB均值方式
Jun 04 Python
python软件都是免费的吗
Jun 18 Python
Python sklearn中的.fit与.predict的用法说明
Jun 28 Python
python 基于UDP协议套接字通信的实现
Jan 22 #Python
详解matplotlib中pyplot和面向对象两种绘图模式之间的关系
Jan 22 #Python
Jmeter调用Python脚本实现参数互相传递的实现
Jan 22 #Python
Python实现王者荣耀自动刷金币的完整步骤
Jan 22 #Python
python实现马丁策略回测3000只股票的实例代码
Jan 22 #Python
Python爬虫回测股票的实例讲解
Jan 22 #Python
python+selenium实现12306模拟登录的步骤
Jan 21 #Python
You might like
linux下使用ThinkPHP需要注意大小写导致的问题
2011/08/02 PHP
基于PHP实现简单的随机抽奖小程序
2016/01/05 PHP
Laravel5.5 数据库迁移:创建表与修改表示例
2019/10/23 PHP
ASP.NET MVC中EasyUI的datagrid跨域调用实现代码
2012/03/14 Javascript
JS简单实现元素复制示例附图
2013/11/19 Javascript
javascript中全局对象的parseInt()方法使用介绍
2013/12/19 Javascript
jQuery DOM插入节点操作指南
2015/03/03 Javascript
百度UEditor编辑器如何关闭抓取远程图片功能
2015/03/03 Javascript
jQuery实现选中弹出窗口选择框内容后赋值给文本框的方法
2015/11/23 Javascript
深入浅析JavaScript中的作用域和上下文
2016/03/26 Javascript
Bootstrap3学习笔记(二)之排版
2016/05/20 Javascript
JS实现兼容各种浏览器的高级拖动方法完整实例【测试可用】
2016/06/21 Javascript
Javascript 实现放大镜效果实例详解
2016/12/03 Javascript
JS获取字符对应的ASCII码实例
2017/09/10 Javascript
Vue组件通信之Bus的具体使用
2017/12/28 Javascript
微信小程序动态生成二维码的实现代码
2018/07/25 Javascript
JavaScript使用表单元素验证表单的示例代码
2019/08/20 Javascript
JavaScript实现PC端四格密码输入框功能
2020/02/19 Javascript
JavaScript 异步时序问题
2020/11/20 Javascript
[01:51]历届DOTA2国际邀请赛举办地回顾 TI9落地上海
2018/08/26 DOTA
详解Python的迭代器、生成器以及相关的itertools包
2015/04/02 Python
Python实现读取及写入csv文件的方法示例
2018/01/12 Python
教你用Python创建微信聊天机器人
2020/03/31 Python
Python OS模块实例详解
2019/04/15 Python
python mysql自增字段AUTO_INCREMENT值的修改方式
2020/05/18 Python
Django通过json格式收集主机信息
2020/05/29 Python
keras 多任务多loss实例
2020/06/22 Python
python使用QQ邮箱实现自动发送邮件
2020/06/22 Python
通过python-pptx模块操作ppt文件的方法
2020/12/26 Python
HTML5 Canvas玩转酷炫大波浪进度图效果实例(附demo)
2016/12/14 HTML / CSS
GAP欧盟网上商店:GAP EU
2016/09/13 全球购物
精美的手工家居和生活用品:Nkuku
2019/11/01 全球购物
机电一体化应届生求职信范文
2014/01/24 职场文书
会计主管岗位职责
2015/04/02 职场文书
Win11绿屏怎么办?Win11绿屏死机的解决方法
2021/11/21 数码科技
PostgreSQL之连接失败的问题及解决
2023/05/08 PostgreSQL