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,一经查实,立即删除!

相关文章

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

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

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

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

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

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

基于流的(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…

DETR精读笔记

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

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

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

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

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

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()…

相对熵与交叉熵_熵、KL散度、交叉熵

公众号关注 “ML_NLP”设为 “星标”,重磅干货,第一时间送达!机器学习算法与自然语言处理出品公众号原创专栏作者 思婕的便携席梦思单位 | 哈工大SCIR实验室KL散度 交叉熵 - 熵1. 熵(Entropy)抽象解释:熵用于计算一个随机变量的信…

动手实现一个带自动微分的深度学习框架

动手实现一个带自动微分的深度学习框架 转自:Automatic Differentiation Tutorial 参考代码:https://github.com/borgwang/tinynn-autograd (主要看 core/tensor.py 和 core/ops.py) 目录 简介自动求导设计自动求导实现一个例子总结参考资料 简介 梯度…

http 错误 404.0 - not found_电脑Regsvr32 用法和错误消息的说明

​ 对于那些可以自行注册的对象链接和嵌入 (OLE) 控件,例如动态链接库 (DLL) 文件或 ActiveX 控件 (OCX) 文件,您可以使用 Regsvr32 工具 (Regsvr32.exe) 来将它们注册和取消注册。Regsvr32.exe 的用法RegSvr32.exe 具有以下命令行选项: Regs…

MobileNet 系列:从V1到V3

MobileNet 系列:从V1到V3 转自:轻量级神经网络“巡礼”(二)—— MobileNet,从V1到V3 自从2017年由谷歌公司提出,MobileNet可谓是轻量级网络中的Inception,经历了一代又一代的更新。成为了学习轻…

mysql 高级知识点_这是我见过最全的《MySQL笔记》,涵盖MySQL所有高级知识点!...

作为运维和编程人员,对MySQL一定不会陌生,尤其是互联网行业,对MySQL的使用是比较多的。MySQL 作为主流的数据库,是各大厂面试官百问不厌的知识点,但是需要了解到什么程度呢?仅仅停留在 建库、创表、增删查改…

teechart mysql_TeeChart 的应用

TeeChart 是一个很棒的绘图控件,不过由于里面没有注释,网上相关的资料也很少,所以在应用的时候只能是一点点的试。为了防止以后用到的时候忘记,我就把自己用到的东西都记录下来,以便以后使用的时候查询。1、进制缩放图…

NLP新宠——浅谈Prompt的前世今生

NLP新宠——浅谈Prompt的前世今生 转自:NLP新宠——浅谈Prompt的前世今生 作者:闵映乾,中国人民大学信息学院硕士,目前研究方向为自然语言处理。 《Pre-train, Prompt, and Predict: A Systematic Survey of Prompting Methods in…

requestfacade 这个是什么类?_Java 的大 Class 到底是什么?

作者在之前工作中,面试过很多求职者,发现有很多面试者对Java的 Class 搞不明白,理解的不到位,一知半解,一到用的时候,就不太会用。想写一篇关于Java Class 的文章,没有那么多专业名词&#xff0…

初学机器学习:直观解读KL散度的数学概念

初学机器学习:直观解读KL散度的数学概念 转自:初学机器学习:直观解读KL散度的数学概念 译自:https://towardsdatascience.com/light-on-math-machine-learning-intuitive-guide-to-understanding-kl-divergence-2b382ca2b2a8 解读…