【办公自动化】用Python批量从上市公司年报中获取主要业务信息

🤵‍♂️ 个人主页:@艾派森的个人主页

✍🏻作者简介:Python学习者
🐋 希望大家多多支持,我们一起进步!😄
如果文章对你有帮助的话,
欢迎评论 💬点赞👍🏻 收藏 📂加关注+


目录

一、Python处理PDF

二、用Python将PDF文件转存为图片

三、往期推荐

四、文末推荐与福利 


一、Python处理PDF

  • Python处理PDF的好处

  1. 自动化和批量处理:使用Python,你可以自动处理大量的PDF文件,例如从扫描仪生成的文档、报告、合同等。这可以节省大量时间和努力,尤其是在需要重复性任务时。

  2. 文本提取:Python可以轻松地从PDF中提取文本内容,使其可搜索、可编辑和可分析。这对于文本分析、数据挖掘和文档检索等任务非常有用。

  3. 报告生成:你可以使用Python创建自定义的PDF报告,将数据、图表和图像等信息以专业的方式呈现。这对于生成自动化的业务报告、数据可视化和数据分析很有帮助。

  4. PDF编辑:Python库和工具使你能够合并、拆分、旋转、裁剪和编辑PDF文件的页面。这对于在不使用专业PDF编辑软件的情况下进行简单的文档编辑很有用。

  5. 图像提取:Python允许你从PDF文件中提取图像,这对于处理包含图形、图表和图片的文档非常有帮助。

  6. 数据提取:当PDF文件包含表格或结构化数据时,Python可以用于提取和转换这些数据,以便进一步分析或导入到数据库中。

  7. 自定义处理:Python提供了多种用于PDF处理的库,允许你根据项目的需求进行自定义处理。你可以选择适合你需求的库,以满足具体要求。

  8. 跨平台:Python是跨平台的,因此你可以在不同操作系统上运行相同的代码,而无需担心兼容性问题。

Python处理PDF文件的主要第三方库包括:

  1. PyPDF2:PyPDF2是一个用于处理PDF文件的库,可以用于提取文本、合并、拆分和旋转PDF文件的页面。它还支持添加页面、水印和书签等功能。

  2. ReportLab:ReportLab是一个用于创建PDF文件的库,允许你以编程方式构建PDF文档,包括添加文本、图像、表格等。

  3. PDFMiner:PDFMiner是一个用于提取文本和元数据的PDF处理库。它可以解析PDF文件并提取文本、布局信息和链接等。

  4. pdf2image:pdf2image是一个用于将PDF文件转换为图像的库,这对于处理包含图形的PDF文件非常有用。

  5. fpdf2:fpdf2是一个用于创建PDF文件的库,支持自定义字体、图像和表格等。

  6. PyMuPDF:PyMuPDF是一个用于处理PDF文件的库,可以用于提取文本、图像和元数据。它还支持PDF文件的渲染和转换为图像。

  7. Camelot:Camelot是一个用于提取表格数据的库,特别适用于从PDF文件中提取表格数据。

  8. Tabula-py:Tabula-py是一个用于提取表格数据的库,可将PDF中的表格转换为DataFrame对象。

  • 开发环境

操作系统:使用windows, mac都可以

Python版本:系统中需要安装Python3.6以上的版本,Python2已经过期不建议使用,Python3.6以前的版本功能相对弱,最好就是采用Python3.6以上的版本

开发工具:有两个可以选择,jupyter notebook,是个网页编辑器,可以运行Python,常常用于交互性、探索性的开发;pycharm,用于成熟脚本,或者web服务的一些开发;这两个工具可以随意选择。

二、用Python将PDF文件转存为图片

技术工具:

Python版本:3.9

代码编辑器:jupyter notebook

        要求批量从上市公司年报中截取公司从事的主要业务信息,以便进行后续的分析。首先我们要分析一下上市公司年报的结构,及目标信息所在位置。一般上市公司的年报都是公开的,可随意下载。其格式一般是PDF。年报内容包含的板块几乎相同,只是深圳市场与上海市场略有区别。随机挑选了10家上市公司的年报(如下图)。可见,公司业务都位于“第三节公司业务概要”,只是上海市场的年报,“第三节”后有空格。其所在页基本在8,9,10页。“第三节”里的第一个小标题,两个市场也有点不同。主要业务介绍完后,接下来都是介绍“主要资产重大变化情况”,这部分及以后的内容都不是我们想要的。因此,打算确定关键词“公司业务概要”及“重大变化情况”,作为文字截取的起始关键词。当然,如果年报中还有其它内容也涉及到这两个词,就会造成干扰。保险起见,在PDF文档内搜索一下,运气不错,这两个关键词在文档中是唯一的,也就是只在这两个地方出现。那就可以放心干了。

        以下,先随便找一家上市公司的年报来测试一下。先导入`pdfplumber`模块,用于提取Pdf文件中的文字(也可以用PyPDF2模块,但读取中文容易出错,因此放弃)。然后设定关键词“重大变化情况”,作为停止搜索标志(这个词后面的内容不是我们想要的)。再打开PDF文件,从第7页开始提取文字,26页终止(因为绝大部分年报的“主要业务”内容在8~15页,有个别到23页了)。将每页的文字信息存入`data`字典。再用`if`语句设定一个终止程序,即当关键词“重大变化情况”出现在当页的内容中时,就停止后续的读取了,因为后续读取到的内容已经不是我们想要的了。这样可以节省时间。打个比方,如果我们要的内容在8~9页,程序只会提取7~9页的内容,后面就不会再提取了。 

#获取年报中的“主要业务”信息
import pdfplumber
file = r"年报\东旭蓝天:2019年年度报告.PDF" 
data = []
key_words = "重大变化情况"
with pdfplumber.open(file) as p:for i in range(6,26): #公司主要业务主要年报的在8~23页范围内page = p.pages[i] #选页page_text = page.extract_text() #提取文字data.append(page_text) #将提取的文字加入列表if key_words in page_text: #到结束关键词即结束抓取信息,避免浪费时间break # 终止for循环

得到的结果如下:

data

        然后,我们就用开始关键词“公司业务概要”和结束关键词“重大变化情况”来截取二者之间的文字。先定义一个文字截取函数,传入起始关键词,及待处理的字符串。通过`find()`方法确定起始关键词对应的位置索引,然后截取二者之间的字符。 

#从字符串中提取指定首尾的文字
def Get_text(start_str, end_str, source_str):start = source_str.find(start_str) #找到开始关键词对应的位置索引if start >= 0:start += len(start_str)end = source_str.find(end_str, start)#找到结束关键词对应的位置索引if end >= 0:return source_str[start:end].strip() #截取起始位置之间的字符
#将数据列表`data`转换成一个大字符串
source_str = "".join(data)
#截取文字
start_str = "公司业务概要"
end_str = "重大变化情况"
text_wanted = Get_text(start_str, end_str, source_str)
text_wanted

        以上,就把想要的内容基本提取出来了。但最后那个几个字“二、主要资产”不是我们要的,因此需要将其去除。先将以上字符串`text_wanted`按照换行符“\n”进行分割,在砍掉最后一个元素,即可得到最终想要的字符串。

final_text = text_wanted.split("\n")[:-1]
final_text

将以上字符串写入txt文件,并按公司名称命名保存。写入的txt文件结果如下:

#定义写入txt的函数
def To_txt(filename, final_text):#filename为写入文件的路径,data为要写入数据列表.file = open(filename + '.txt','w',encoding="utf-8")file.write(filename + "\n")for i in range(len(final_text)):text = final_text[i]if i != len(final_text)-1: #判断是否最后一个元素text = text+'\n'   #若不是最后一个元素才换行file.write(text)file.close()To_txt(r"年报\东旭蓝天:2019年年度报告",final_text)

        成功搞定一个之后,我们就可以批量处理了。将待处理的年报放入指定路径,然后获取其路径,存入列表`files`。稍微整合一下程序,运行。10份年报,用时144秒,平均1份年报14秒。

#获取待处理的年报的路径
import os
path='年报'  #文件所在文件夹
files = [path+"\\"+i for i in os.listdir(path)] #获取文件夹下的文件名,并拼接完整路径
files

 

import pdfplumber
import time
time0= time.time()
#从字符串中提取指定首尾的文字
def Get_text(start_str, end_str, source_str):start = source_str.find(start_str) #找到开始关键词对应的位置索引if start >= 0:start += len(start_str)end = source_str.find(end_str, start)#找到结束关键词对应的位置索引if end >= 0:return source_str[start:end].strip() #截取起始位置之间的字符#定义写入txt的函数
def To_txt(filename, final_text):#filename为写入文件的路径,data为要写入数据列表.file = open(filename + '.txt','w',encoding="utf-8")file.write(filename + "\n")for i in range(len(final_text)):text = final_text[i]if i != len(final_text)-1: #判断是否最后一个元素text = text+'\n'   #若不是最后一个元素才换行file.write(text)time.sleep(0.1) #加入一个延时,避免批量写入出现乱码file.close()#获取年报中的“主要业务”信息
for file in files:data = []key_words = "重大变化情况"with pdfplumber.open(file) as p:for i in range(6,26): #公司主要业务主要年报的在8~23页范围内page = p.pages[i] #选页page_text = page.extract_text() #提取文字data.append(page_text) #将提取的文字加入列表if key_words in page_text: #到结束关键词即结束抓取信息,避免浪费时间break # 终止for循环        #将数据列表`data`转换成一个大字符串source_str = "".join(data)#截取文字start_str = "公司业务概要"end_str = "重大变化情况"text_wanted = Get_text(start_str, end_str, source_str)#去掉不需要的尾巴final_text = text_wanted.split("\n")[:-1]new_file = "主要业务\\" + file.split("\\")[1][:-4]To_txt(new_file,final_text)print("{} 处理完成!".format(new_file))time1= time.time()
print("处理完成,共用时 {} 秒。".format(time1-time0))

 

三、往期推荐

Python提取pdf中的表格数据(附实战案例)

使用Python自动发送邮件

Python操作ppt和pdf基础

Python操作word基础

Python操作excel基础

使用Python一键提取PDF中的表格到Excel

 使用Python批量生成PPT版荣誉证书

使用Python批量处理Excel文件并转为csv文件

四、文末推荐与福利 

清华社【秋日阅读企划】领券立享优惠

IT好书 5折叠加10元无门槛优惠券:https://u.jd.com/Yqsd9wj

活动时间:9月4日-9月17日,先到先得,快快来抢!

 

 

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

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

相关文章

软件测试行业已经卷到什么程度了?

近几个月经常听到IT行业的人员吐槽找工作难的事情,特别是找软件测试工作相比前几年难了很多,以前只要简历一挂网上,每天会接到好多个面试邀请电话,甚至两三天或者一周内就能把工作找好,而现在把简历投了个遍&#xff0…

在Linux上利用宝塔面板搭建网站,并通过内网穿透方便地实现公网访问

文章目录 前言1. 环境安装2. 安装cpolar内网穿透3. 内网穿透4. 固定http地址5. 配置二级子域名6. 创建一个测试页面 前言 宝塔面板作为简单好用的服务器运维管理面板,它支持Linux/Windows系统,我们可用它来一键配置LAMP/LNMP环境、网站、数据库、FTP等&…

IDEA报错:No valid Maven installation found

当我想要用maven进行clean的时候,发现报了这个错误,idea的event logs记录为 网上又说可能是因为你的maven环境没有配置好,我对我的maven进行了检查,发现是没有问题的,在这里提醒大家,如果你以前的项目maven…

计算机竞赛 机器视觉opencv答题卡识别系统

0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 答题卡识别系统 - opencv python 图像识别 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐! 🥇学长这里给一个题目综合评分(每项满分5分…

ChatGPT新增超强插件:文本直接生成视频、海报,支持自定义修改!

全球著名在线设计平台Canva,在ChatGPT Plus(GPT-4)上推出了插件功能,用户通过文本提示,几秒钟就能生成演示文稿、PPT插图、电子书封面、宴会邀请函等各种精美设计海报,同时支持生成视频。 该插件最强大的功…

爬虫系统的核心:如何创建高质量的HTML文件?

在网页抓取或爬虫系统中,HTML文件的创建是一项重要的任务。HTML文件是网页的基础,包含了网页的所有内容和结构。在爬虫系统中,我们需要生成一个HTML文件,以便于保存和处理网页的内容。 在这种情况下,可以使用Java函数…

Zebec 生态 AMA 回顾:Nautilus 以及 $ZBC 的未来

在9月7日,Zebec创始人Sam做客社区,并进行了“Nautilus Chain以及$ZBC的未来”主题的AMA访谈。Sam在本次访谈中对Nautilus Chain生态的价值捕获、Zebec生态布局规划、可能会推出的Nautilus Chain治理通证NAUT进行了解读。本文将对本次AMA进行回顾与总结。…

城市内涝监测预警系统:有效降低内涝风险,保障城市安全

近日,受台风“海葵”的影响,福建广东多地遭遇了持续性强降雨的袭击,道路积水严重,“城市看海”模式再次开启,不少网友纷纷调侃房子已经升级为海景房。近年来受极端天气影响,城市内涝灾害越发凸显&#xff0…

0015Java程序设计-springboot美食网站

摘 要目 录**绪论**1.1背景及意义1.2 国内外研究概况1.3 研究的内容 开发环境 摘 要 随着移动应用技术的发展,越来越多的用户借助于移动手机、电脑完成生活中的事务,许多的传统行业也更加重视与互联网的结合。 本论文主要介绍基于java的美食网站&#…

Jmeter安装与测试

目录 一:JMeter简介: 二:JMeter安装与配置 三:JMeter主要原件 一:JMeter简介: JMeter,一个100%的纯Java桌面应用,由Apache组织的开放源代码项目,它是功能 …

VoxWeekly|The Sandbox 生态周报|20230911

欢迎来到由 The Sandbox 发布的《VoxWeekly》。我们会在每周发布,对上一周 The Sandbox 生态系统所发生的事情进行总结。 如果你喜欢我们内容,欢迎与朋友和家人分享。请订阅我们的 Medium 、关注我们的 Twitter,并加入 Discord 社区&#xf…

gif动画如何快速生成?教你几步快速搞定gif制作

gif动画图片已经充斥着我们的日常生活,它的画面丰富生动,且易于传播和保存。平时工作时也能用到,特别是需要有操作演示的时候,就可以把演示的视频做成gif动图。通过使用【GIF中文网】这款gif动画制作(https://www.gif.…

C++项目实战——基于多设计模式下的同步异步日志系统-②-前置知识补充-不定参函数

文章目录 专栏导读不定参函数C风格不定参函数不定参宏函数 专栏导读 🌸作者简介:花想云 ,在读本科生一枚,C/C领域新星创作者,新星计划导师,阿里云专家博主,CSDN内容合伙人…致力于 C/C、Linux 学…

idea启动缓慢解决办法

idea启动缓慢解决办法 文章目录 idea启动缓慢解决办法前言一、修改内存大小二、虚拟机运行大小三、插件禁用1、安卓相关2、构建工具3、Code Coverage 代码覆盖率4、数据库5、部署工具6、html和xml7、ide settings8、JavaScript框架和工具9、jvm框架10、Keymap快捷键映射11、kot…

ChatGPT帮助一名儿童确诊病因,之前17位医生无法确诊

9月13日,Today消息,一位名叫Alex的4岁儿童得了一种浑身疼痛的怪病,每天需要服用Motrin(美林)才能止痛。3年的时间,看了17名医生无法确诊病因。(新闻地址:https://www.today.com/heal…

java使用itext生成pdf

效果&#xff1a; maven依赖 <!--PDF处理--><!-- https://mvnrepository.com/artifact/com.itextpdf/itextpdf --><dependency><groupId>com.itextpdf</groupId><artifactId>itextpdf</artifactId><version>5.5.13.3</vers…

【Unity3D赛车游戏优化篇】【十】汽车粒子特效和引擎咆哮打造极速漂移

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;Uni…

jdk 中的 keytool 的使用,以及提取 jks 文件中的公钥和私钥

这里暂时只需要知道如何使用就可以了。 首先是生成一个密钥&#xff0c; keytool -genkeypair -alias fanyfull -keypass ffkp123456 -validity 365 -storepass ffsp123456 -keystore fanyfull.jks -keyalg RSA解释一下这里的选项&#xff0c; -alias 密钥对的名称-keypass …

前端测试——端对端测试框架 Playwright 总结

在进行前端测试前&#xff0c;我们需要明确我们需要怎样的前端测试。 前端测试类型总结 前端应用测试分为几种常见类型: 端到端&#xff08;e2e&#xff09; &#xff1a;一个辅助机器人&#xff0c;表现得像一个用户&#xff0c;在应用程序周围点击&#xff0c;并验证其功能…

第十届IEEE电气工程与自动化国际学术论坛(IFEEA 2023)

第十届IEEE电气工程与自动化国际学术论坛&#xff08;IFEEA 2023&#xff09; 2023 10th International Forum on Electrical Engineering and Automation IFEEA论坛属一年一度的国际学术盛会。因其影响力及重要性&#xff0c;IFEEA论坛自创建筹办以来&#xff0c;便受到国内…