当前位置: 首页 > news >正文

python自动处理文档_用Python完成一件小事:自动生成文档报告

73803f04-4aec-4f71-b4a7-7a013c5e2021

笔者在工作中时常遇到以下的问题:

作为文档汇总人,需要合并其他同事发来的内容。虽然有同样的文档模板,但由于不同人协作编写,所以在格式和内容编写风格上都千差万别,汇总工作耗时耗力。

时常编写内容差别不大的数据分析报告(基于简单统计、对比分析),每次都根据数据变化情况进行内容修改,重复繁杂。

嫌文档格式、模板调整工作无聊、枯燥无味,但又不得不做。

相信很多朋友也一样经历过类似的麻烦事情,但从现在开始,上诉问题都将慢慢的不复存在。因为,今天我要分享的内容就是:

使用Python自动生成报告。

让机器为人干活,是人类今后发展的方向。

首先,介绍下要用的工具:python的docx库。

安装方法很简单:

(1)pip安装

pip install python-docx

(2)easy_install安装

easy_install python-docx

(3)下载安装包,进行手动安装

tar xvzf python-docx-{version}.tar.gz

cd python-docx-{version}

python setup.py install

以下是官方示例:

from docx import Document

from docx.shared import Inches

document = Document()

document.add_heading('Document Title', 0)

p = document.add_paragraph('A plain paragraph having some ')

p.add_run('bold').bold = True

p.add_run(' and some ')

p.add_run('italic.').italic = True

document.add_heading('Heading, level 1', level=1)

document.add_paragraph('Intense quote', style='Intense Quote')

document.add_paragraph(

'first item in unordered list', style='List Bullet'

)

document.add_paragraph(

'first item in ordered list', style='List Number'

)

document.add_picture('monty-truth.png', width=Inches(1.25))

records = (

(3, '101', 'Spam'),

(7, '422', 'Eggs'),

(4, '631', 'Spam, spam, eggs, and spam')

)

table = document.add_table(rows=1, cols=3)

hdr_cells = table.rows[0].cells

hdr_cells[0].text = 'Qty'

hdr_cells[1].text = 'Id'

hdr_cells[2].text = 'Desc'

for qty, id, desc in records:

row_cells = table.add_row().cells

row_cells[0].text = str(qty)

row_cells[1].text = id

row_cells[2].text = desc

document.add_page_break()

document.save('demo.docx')

运行完就可以看到效果了。(大家可以自行尝试)

看完了docx库基本功能介绍,接下来开始讲解文档自动生成的全过程。我们以系统运维人员每日编写的简报自动生成场景为例。

第一步:运维数据统计表设计

7bff8732-31e5-4989-84f6-ce3e93900b6c

运维基础数据统计表设计

从图中可以看到,我们的基础数据统计表由几个核心字段组成:

系统名称

主机IP

主机用途

CPU使用情况

内存使用情况

磁盘使用情况

告警次数

故障次数

已处理故障次数

告警详细描述

故障详细描述

处置结果描述

拟采取措施

等。这些字段基本上可以记录系统当日运行情况,后面的报告也是基于这些基本信息进行生成。

先读入数据。

#读入运维数据统计表

data_path = 'report_tmp-模板.csv' #基础模板数据

df_tmp = pd.read_csv(data_path,encoding='gbk')#中文

cols = list(df_tmp.columns)

df_tmp = df_tmp.fillna('无')

第二步:进行数据分析逻辑描述

先想象一下报告由自己人工来编写,需要从哪些方面去分析数据呢?先按一套系统维度来看,首先是有没有发生故障?故障是不是已经处置?如何处置的?其次,是看有没有告警?是否有风险?最后,是资源使用情况,是否正常?

理清思路之后,就可以按顺序将描述过程用Python代码进行翻译,拼接成报告的模板(报告的负责程度全由您自己掌控)。

(1)统计各项数据

system_cnt = len(df_tmp['系统名称'].unique())

alarm_cnt = int(df_tmp['告警次数'].sum())

fault_cnt = int(df_tmp['故障次数'].sum())

fault_handled_cunt = int(df_tmp['已处理故障次数'].sum())

sys_names = df_tmp[cols[1]].unique()

host_cnt = len(df_tmp['主机IP'].unique())

(2)按分析逻辑拼接报告模板

总体概述:

#初始化报告

document = Document()

#标题

title = '核心系统运维监控简报'

header = add_head_title(document,title)

#总体概述

sub_title1 = '一、总体概述'

add_head_level_1(document,sub_title1)

total_desc = '{0},运维团队持续对{1}套核心系统进行运维监测,共涉及核心服务器{2}台,今日发生故障{3}次,系统告警共计{4}次'\

.format(date_str,system_cnt,host_cnt,fault_cnt,alarm_cnt)

if fault_cnt > 0:

if fault_cnt == fault_handled_cunt:

total_desc += ',所有故障均已完成处置。'

else:

total_desc += ',已完成{}项故障处置,剩{}项暂未处理,具体原因见后详情。'.format(fault_handled_cunt,(fault_cnt-fault_handled_cunt))

else:

total_desc += ',所有系统均正常运行。'

total_desc += '具体情况如下。'

故障方面分析:

# 故障方面

sys_fault_ct = sysdata[cols[8]].sum()

sys_fault_hd_ct = sysdata[cols[9]].sum()

sys_fault_descs = sysdata[['主机IP','故障详细描述','处置结果描述','拟采取措施','主机用途']]

sys_fault_list = sys_fault_descs[sys_fault_descs['故障详细描述']!='无'].values

if sys_fault_ct == 0:

add_paragraph(document,'故障方面,{}系统未发生故障,全天正常运行。'.format(v))

else:

para = add_paragraph(document, '故障方面,{0}系统今日共发生{1}次故障,已经完成处理{2}项。'.format(v,sys_fault_ct,sys_fault_hd_ct))

run = para.add_run('具体故障主要为:')

run.font.name = '仿宋'

run._element.rPr.rFonts.set(qn('w:eastAsia'), '仿宋')

for j,faults in enumerate(sys_fault_list):

para1 = add_paragraph(document,'({0})主机[{2}]({1})'.format(j+1,faults[0],faults[4]))

run1 = para1.add_run('{0}。'.format(faults[1]))

run1.font.color.rgb = RGBColor(255, 0, 0)

run1.font.name = '仿宋'

run1._element.rPr.rFonts.set(qn('w:eastAsia'), '仿宋')

if faults[2] != '无':

run1 = para1.add_run('目前{}。'.format(faults[2]))

run1.font.name = '仿宋'

run1._element.rPr.rFonts.set(qn('w:eastAsia'), '仿宋')

if faults[3] != '无':

run1 = para1.add_run('{0}。'.format(faults[3]))

run1.font.name = '仿宋'

run1._element.rPr.rFonts.set(qn('w:eastAsia'), '仿宋')

其他内容可按需定制。

第三步:生成报告并保存

模板拼接好后,可将内容进行持久化保存(文件名用日期区分)。

#保存文件

document.save('{0}-{1}.docx'.format(title,date_str))

print('报告自动生成完成!')

经过上述三个步骤,我们的运维日简报就已经自动生成完成了。以下是效果图。

96b0b6012dd24e719b18207e596c1804

自动生成的运维简报

有了这样的工具,后续的工作就简单了,只需要修改数据统计表中的内容,然后运行一次程序,每天的报告就自动完成了。:)

结束语

相关文章:

  • htmlcss实例小项目_HTMLCSS学习笔记(一)-- 入门介绍
  • drools规则引擎可视化_几大工作流引擎对比
  • python3检测文件的编码格式_python判断文件的编码格式是否为UTF8 无BOM格式
  • git-2.29.2.2-64-bit安装_FairRoot安装注意事项
  • java执行sql文件_Mybatis进阶笔记:架构概述与基本执行流程梳理
  • catia二次开发_CATIA二次开发文件双手奉上,重命名非参后的CATPart
  • admin manager_Hadoop - 企业级大数据管理平台CDH(安装cloudera-manager)
  • python如何打印字符串_python 中 打印及格式化字符串的相关方法
  • selenium firefox驱动_[Selenium]2.开发环境配置
  • js regexp 匹配任意一个字符串_JavaScript基础知识:字符串的使用和基本操作
  • python列表的存储结构_3-Python内置结构-列表
  • 用python制作新用户注册系统_[宜配屋]听图阁
  • python中typeerror_Python中的TypeError类
  • python手工打码_打码兔和超人打码python版
  • python 将图片转换成像素画_Python用61行代码实现图片像素化
  • 自己简单写的 事件订阅机制
  • [nginx文档翻译系列] 控制nginx
  • Android 架构优化~MVP 架构改造
  • Android交互
  • C++回声服务器_9-epoll边缘触发模式版本服务器
  • Fundebug计费标准解释:事件数是如何定义的?
  • Java程序员幽默爆笑锦集
  • java取消线程实例
  • java中的hashCode
  • jQuery(一)
  • JS进阶 - JS 、JS-Web-API与DOM、BOM
  • react-core-image-upload 一款轻量级图片上传裁剪插件
  • spring boot 整合mybatis 无法输出sql的问题
  • SQLServer之创建数据库快照
  • TCP拥塞控制
  • TypeScript实现数据结构(一)栈,队列,链表
  • 更好理解的面向对象的Javascript 1 —— 动态类型和多态
  • 如何使用 OAuth 2.0 将 LinkedIn 集成入 iOS 应用
  • 如何用Ubuntu和Xen来设置Kubernetes?
  • 一起来学SpringBoot | 第三篇:SpringBoot日志配置
  • 用element的upload组件实现多图片上传和压缩
  • Android开发者必备:推荐一款助力开发的开源APP
  • 格斗健身潮牌24KiCK获近千万Pre-A轮融资,用户留存高达9个月 ...
  • ​html.parser --- 简单的 HTML 和 XHTML 解析器​
  • ​第20课 在Android Native开发中加入新的C++类
  • !!【OpenCV学习】计算两幅图像的重叠区域
  • # Panda3d 碰撞检测系统介绍
  • #define与typedef区别
  • #每日一题合集#牛客JZ23-JZ33
  • $L^p$ 调和函数恒为零
  • (六)激光线扫描-三维重建
  • (每日持续更新)jdk api之StringBufferInputStream基础、应用、实战
  • (十二)python网络爬虫(理论+实战)——实战:使用BeautfulSoup解析baidu热搜新闻数据
  • (未解决)jmeter报错之“请在微信客户端打开链接”
  • (转)linux自定义开机启动服务和chkconfig使用方法
  • (转)创业家杂志:UCWEB天使第一步
  • (转)利用ant在Mac 下自动化打包签名Android程序
  • .cfg\.dat\.mak(持续补充)
  • .NET Core 版本不支持的问题
  • .Net Memory Profiler的使用举例