python中提取几列_Python一键提取PDF中的表格到Excel(实例50)

425fab78778b004b4b485200eb5879e4.gif

从PDF文件获取表格中的数据,也是日常办公容易涉及到的一项工作。一个一个复制吧,效率确实太低了。用Python从PDF文档中提取表格数据,并写入Excel文件,灰常灰常高效282d4fedf291fcea5761672d284649d2.pngb2eb63cb084bc6b91cb59fedc8511e3a.png

上市公司的年报往往包含几百张表格,用它作为例子再合适不过,搞定这个,其他含表格的PDF都是小儿科了。今天以"保利地产年报"为例,这个PDF文档中有321页含有表格,总表格数超过这个数了。 先导入PDF读取模块pdfplumber,随便挑一页看下表格数据的结构。如下,我们挑了第4页pages[3]来读取其中的表格,并显示。这里读取表格,用到了extract_tables(),即默认每页有多个表格。它会将单个表格的数据按行读取存入列表,再将每个表格的所有数据汇总存到一个上一级列表,最后将所有表格的数据汇总到一个大列表。而extract_table()方法则只能读一张表,当一个页面有多张表,就默认选第一个,因此会漏掉后面的。而且它们的数据结构也不同,差异如下。

5c73fb4a89eb5c7d9fbff6a2117e6379.png

“保利地产年报”第四页如图所示,读取的结果存到列表table,显示如下。

d700432c0569198a812814950790536d.png

#观察读取出来的表格的数据结构
import pdfplumber
with pdfplumber.open("保利地产年报.pdf") as p:
    page = p.pages[3] #选取第4页(起始页为0)
    table = page.extract_tables() #多表格读取,存为嵌套列表
    print(table)
[[['', '常用词语释义', None, None, None, None, None, ''], ['中国证监会', None, '', '指', '', '', '中国证券监督管理委员会', ''], ['国资委', None, '', '指', '', '', '国务院国有资产监督管理委员会', ''], ['上交所', None, '', '指', '', '上海证券交易所', None, None], ['公司、本公司、保利地产', None, '指', None, None, '保利发展控股集团股份有限公司,原名称保利房\n地产(集团)股份有限公司', None, None], ['报告期、本报告期', None, '', '指', '', '2018年度', None, None], ['元、万元、亿元', None, '', '指', '', '人民币元、人民币万元、人民币亿元', None, None]], [['公司的中文名称', '保利发展控股集团股份有限公司'], ['公司的中文简称', '保利地产'], ['公司的外文名称', 'Poly Developments and Holdings Group Co., Ltd.'], ['公司的外文名称缩写', 'PDH'], ['公司的法定代表人', '宋广菊']], [['', '董事会秘书', '证券事务代表'], ['姓名', '黄海', '尹超'], ['联系地址', '广东省广州市海珠区阅江中路688号保利国际广场北塔33层董事会办公室', None], ['电话', '020-89898833', None], ['传真', '020-89898666-8831', None], ['电子信箱', 'stock@polycn.com', None]], [['公司注册地址', '广州市海珠区阅江中路688号保利国际广场30-33层'], ['公司注册地址的邮政编码', '510308'], ['公司办公地址', '广州市海珠区阅江中路688号保利国际广场北塔30-33层'], ['公司办公地址的邮政编码', '510308'], ['公司网址', 'www.polycn.com;www.gzpoly.com'], ['电子信箱', 'stock@polycn.com']], [['公司选定的信息披露媒体名称', '《中国证券报》、《上海证券报》、《证券时报》'], ['登载年度报告的中国证监会指定网站的网址', 'www.sse.com.cn'], ['公司年度报告备置地点', '公司董事会办公室']]]

54da7d21b2b851564dbe63cdf5c4f2d5.png

确保可正常读取表格,以及了解读取出来的表格的数据结构,下面就可以一次性读取出所有表格,并存入Excel文件中了。导入相应模块,然后使用pdfplumber打开PDF文件。使用Workbook()新建Excel工作簿,然后使用remove()将其自带的工作表删除。因为我们想用PDF文件中表格所在的页码给相应的Excel工作表命名,以便二者的编号一致,方便后续查询。所以需要使用enumerate()给PDF的页从1开始编号。然后使用extract_tables()获取表格数据。 当然,如果当页没有表格,则extract_tables()获得的是空值None。在后续的操作中,空值会报错,所以加入if语句来做个判断。只有当列表tables不为空,即里面有货的时候,才建新的Excel表格,并执行后续的写入操作。列表tables若为空(即当页没有表格),则直接跳到下一页。 当发现当页有表格后,新建一个Excel表,以“Sheet”加上此时PDF的页码(比如“Sheet3”)命名。在写入数据时,先用一个for循环获得单个表格的数据,再用第二个for循环获得表格中一行的数据,然后写入Excel表。最后保存数据。由于表格太多,程序运行时间较长,大约需要3分钟。

import pdfplumber
from openpyxl import Workbook    
with pdfplumber.open("保利地产年报.pdf") as p:
    wb = Workbook() #新建excel工作簿
    wb.remove(wb.worksheets[0])#删除工作簿自带的工作表
    for index,page in enumerate(p.pages,start = 1): #从1开始给所有页编号
        tables = page.extract_tables() #读取表格
        if tables: #判断是否存在表格,若不存在,则不执行下面的语句
            ws = wb.create_sheet(f"Sheet{index}") #新建工作表,表名的编号与表在PDF中的页码一致
            for table in tables: #遍历所有列表
                for row in table: #遍历列表中的所有子列表,里面保存着行数据
                    ws.append(row) #写入excel表
    wb.save("保利地产年报表格.xlsx")

数百个表格就这样潇洒地复制到Excel表格中了83c1709f918252906bc1e9f62ed72bb6.png

155f0a42f39e3716bc62d003db38b445.png

如果想要指定某个表格,在提取数据的时候指定页码即可。但如果想批量导出大量不同公司的年报的指定表格,则需要使用关键词定位了。还好,无论深圳市场还是上海市场,公司的年报中的标题基本都是唯一的,这给我们用标题做关键词提供了方便。假设我们需要提取公司“主要会计数据”下面的表格,则用关键词“主要会计数据”定位即可。如下以此为例进行操作。

import os
import pdfplumber
from openpyxl import Workbook    

path='PDF'  #文件所在文件夹
files = [path+"\\"+i for i in os.listdir(path)] #获取文件夹下的文件名,并拼接完整路径
key_words = "主要会计数据"

for file in files:
    with pdfplumber.open(file) as p:
        wb = Workbook() #新建excel工作簿
        wb.remove(wb.worksheets[0])#删除工作簿自带的工作表

        #获取关键词所在页及下一页的页码
        pages_wanted = []
        for index,page in enumerate(p.pages): #从0开始给所有页编号
            if key_words in page.extract_text():
                pages_wanted.append(index)
                pages_wanted.append(index+1)
                break

        #提取指定页码里的表格
        for i in pages_wanted:     
            page = p.pages[i]
            tables = page.extract_tables() #读取表格
            if tables: #判断是否存在表格,若不存在,则不执行下面的语句
                ws = wb.create_sheet(f"Sheet{i+1}") #新建工作表,表名的编号与表在PDF中的页码一致
                for table in tables: #遍历所有列表
                    for row in table: #遍历列表中的所有子列表,里面保存着行数据
                        ws.append(row) #写入excel表
        wb.save("Excel\\{}.xlsx".format(file.split("\\")[1].split(".")[0]))

以上,增加了一段获取关键词所在页码及下一页的页码的程序。之所以要获取关键词下一页页码,是因为有些表格会跨页,为了不遗漏数据,宁愿多获取一点。一旦找到关键词所在页,马上用break停止for循环。后面再遍历pages_wanted里面储存的页码,提取表格并写入Excel文件,并保存即可。批量获取的指定内容保存在Excel文件夹下。

3cda0eee4ff2394c7a4550fea2736ba9.png

如果您有需要处理的问题,可发邮件到我邮箱:donyo@qq.com,一起探讨解决方案。微信公众号输入“源文件”提取所有源文件及资料。

ed3f89c04833b5887e929d4c3983f400.png

最好的赞赏就是点亮下方“在看”,多给PythonOffice积攒一点人气哈!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/532415.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

EM算法公式推导

EM算法公式推导 EM 算法是一种用来进行含有隐变量的概率生成模型参数估计的迭代算法。 EM算法步骤 EM 算法通过迭代求 L(θ)log⁡P(X∣θ)L(\theta)\log P(X|\theta)L(θ)logP(X∣θ) 的极大似然估计,每次迭代包含两部:E步,求期望&#xf…

详解最大似然估计(MLE)、最大后验概率估计(MAP),以及贝叶斯公式的理解

详解最大似然估计(MLE)、最大后验概率估计(MAP),以及贝叶斯公式的理解 声明:本文为原创文章,发表于nebulaf91的csdn博客。欢迎转载,但请务必保留本信息,注明文章出处。 本…

elemntui icon 大小_自定义elementui中的图标

前提elementui图标库图标较少当你想用elementui的控件而不想用它的图标时,就可以使用自定义的方式来实现实现el-icon-my-export为我自定义的图标命名导出//使用图片来替换//before属性中的content文本是用来占位的,必须有//可以设置字体大小来确定大小//使用visibil…

变分推断公式推导

变分推断公式推导 背景介绍 机器学习中的概率模型可分为频率派和贝叶斯派。频率派最终是求一个优化问题,而贝叶斯派则是求一个积分问题。 频率派 举几个例子: 线性回归 样本数据:{(xi,yi)}i1N\{(x_i,y_i)\}_{i1}^N{(xi​,yi​)}i1N​ 模…

重新打开_iPhone 应用停止响应或无法打开的解决办法

如果当您在 iPhone 上使用某个重要应用时,遇到应用停止响应、意外退出或无法打开的问题,请参考如下步骤尝试解决:1.强制退出应用:在 iPhone 后台强制关闭该应用之后,再次重新打开看看。2.重启您的设备,然后…

机器学习理论——优雅的模型:变分自编码器(VAE)

机器学习理论——优雅的模型:变分自编码器(VAE) 转自:机器学习理论—优雅的模型(一):变分自编码器(VAE) 另外直观理解 VAE, 推荐 台大李宏毅老师的课程&#…

grub引导项修复详解_重新安装win7后,修复Grub启动项

重新安装win7后,修复Grub启动项发布时间:2010-09-14 22:14:00来源:红联作者:null925[is] 本帖最后由 null925 于 2010-9-14 22:18 编辑 [/i]原先使用Win7,Gentoo,Ubuntu三系统,Grub作为系统引导管理器,今天重新安装Win…

基于流的(Flow-based)生成模型简介

基于流的(Flow-based)生成模型简介 生成任务 我们先回顾一下所谓的生成任务,究竟是做什么事情。我们认为,世界上所有的图片,是符合某种分布 pdata(x)p_{data}(x)pdata​(x) 的。当然,这个分布肯定是个极其复杂的分布。而我们有一…

iec60870-5-104通讯协议编程_三菱FX编程口通讯协议1——协议解读

三菱PLC编程口通讯协议:1、三菱PLC编程口通讯协议有四个命令,如下:2、三菱FX系列PLC地址对应表:PLC_X Group Base AddRess128;Const PLC_Y_Group Base AddRess160;M _Group Base_AddRess 256;P…

采用ODP.NET 批量进行数据同步

因开发、测试场景经常需要模拟机生产环境的数据,原同事开发了一个ado.net图形化同步工具,对非技术人员操作友好,但对技术员使用并不方便,每次同步需源库数据与目标的数据源字段进行配置,且同步大数据时慢,因…

熔断器熔断时间标准_一种熔断器熔断时间测试电路的制作方法

本实用新型涉及汽车制造技术领域,尤其涉及一种熔断器熔断时间测试电路。背景技术:伴随着日新月异的科技进步,人们对生活质量的追求也越来越高,汽车已经成为人们日常出行必不可少的交通工具,人们对汽车的舒适性、安全性…

DETR精读笔记

DETR精读笔记 论文:End-to-End Object Detection with Transformers (发表于 ECCV-2020) 代码:https://github.com/facebookresearch/detr 解读视频:DETR 论文精读【论文精读】 本笔记主要基于 Yi Zhu 老师的解读 引言…

lcd像素点密度_【教程】设置添加LCD密度(DPI)设置

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼完美—————————————————分割————————————————————————反编译settings.apk(1.52)1.Settings.apk\res\values\arrays.xml在之前加入以下代码240242244246248250252254256258260262264266268…

GAN网络评估指标:IS、FID、PPL

GAN网络评估指标:IS、FID、PPL 转自:IS、FID、PPL,GAN网络评估指标 另外关于GAN的评价指标,推荐李宏毅老师的视频:【機器學習2021】生成式對抗網路 (Generative Adversarial Network, GAN) (三) – 生成器效能評估與條…

降维后输入分类器分类时报错_逻辑回归解决多分类方法及其优缺点分析

众所周知,逻辑回归常用于解决二分类任务,但是在工作/学习/项目中,我们也经常要解决多分类问题。本文总结了 3 种逻辑回归解决多分类的方法,并分析了他们的优缺点。一、One-Vs-Rest假设我们要解决一个分类问题,该分类问…

浅谈 PyTorch 中的 tensor 及使用

浅谈 PyTorch 中的 tensor 及使用 转自:浅谈 PyTorch 中的 tensor 及使用 这篇文章主要是围绕 PyTorch 中的 tensor 展开的,讨论了张量的求导机制,在不同设备之间的转换,神经网络中权重的更新等内容。面向的读者是使用过 PyTorch …

简述springmvc过程_spring mvc的工作流程是什么?

展开全部SpringMVC工作流程描述向服务器发送HTTP请求,请求被前端控制器 DispatcherServlet 捕获。DispatcherServlet 根据 -servlet.xml 中的配置对请62616964757a686964616fe59b9ee7ad9431333365646233求的URL进行解析,得到请求资源标识符(URI)。 然后根…

PyTorch 的 Autograd

PyTorch 的 Autograd 转自:PyTorch 的 Autograd PyTorch 作为一个深度学习平台,在深度学习任务中比 NumPy 这个科学计算库强在哪里呢?我觉得一是 PyTorch 提供了自动求导机制,二是对 GPU 的支持。由此可见,自动求导 (a…

商场楼层导视牌图片_百宝图商场电子导视软件中预约产品功能简介

百宝图商场电子导视软件中预约产品功能简介 管理端,可配合百宝图商场电子导视软件配套使用 1:数据展示:图形展示总预约数/预约时间峰值/预约途径/各途径数量对比 2:数据统计:有效预约数量/无效预约数量/无效预约原因备…

Pytorch autograd.grad与autograd.backward详解

Pytorch autograd.grad与autograd.backward详解 引言 平时在写 Pytorch 训练脚本时,都是下面这种无脑按步骤走: outputs model(inputs) # 模型前向推理 optimizer.zero_grad() # 清除累积梯度 loss.backward() # 模型反向求导 optimizer.step()…