百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

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

toyiye 2024-07-06 23:30 32 浏览 0 评论



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

  • 作为文档汇总人,需要合并其他同事发来的内容。虽然有同样的文档模板,但由于不同人协作编写,所以在格式和内容编写风格上都千差万别,汇总工作耗时耗力。
  • 时常编写内容差别不大的数据分析报告(基于简单统计、对比分析),每次都根据数据变化情况进行内容修改,重复繁杂。
  • 嫌文档格式、模板调整工作无聊、枯燥无味,但又不得不做。

相信很多朋友也一样经历过类似的麻烦事情,但从现在开始,上诉问题都将慢慢的不复存在。因为,今天我要分享的内容就是:使用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库基本功能介绍,接下来开始讲解文档自动生成的全过程。我们以系统运维人员每日编写的简报自动生成场景为例。

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


从图中可以看到,我们的基础数据统计表由几个核心字段组成:系统名称主机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('报告自动生成完成!')

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


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


结束语

今天的分享就到这里,感谢大家的阅读。由于篇幅原因,未能将所有代码贴出,需要完整源代码的朋友,可以通过评论给我留言,或私信联系我。同时,请大家在评论区给我一些反馈和指导,以帮助我提升文章内容质量,谢谢大家。

相关推荐

为何越来越多的编程语言使用JSON(为什么编程)

JSON是JavascriptObjectNotation的缩写,意思是Javascript对象表示法,是一种易于人类阅读和对编程友好的文本数据传递方法,是JavaScript语言规范定义的一个子...

何时在数据库中使用 JSON(数据库用json格式存储)

在本文中,您将了解何时应考虑将JSON数据类型添加到表中以及何时应避免使用它们。每天?分享?最新?软件?开发?,Devops,敏捷?,测试?以及?项目?管理?最新?,最热门?的?文章?,每天?花?...

MySQL 从零开始:05 数据类型(mysql数据类型有哪些,并举例)

前面的讲解中已经接触到了表的创建,表的创建是对字段的声明,比如:上述语句声明了字段的名称、类型、所占空间、默认值和是否可以为空等信息。其中的int、varchar、char和decimal都...

JSON对象花样进阶(json格式对象)

一、引言在现代Web开发中,JSON(JavaScriptObjectNotation)已经成为数据交换的标准格式。无论是从前端向后端发送数据,还是从后端接收数据,JSON都是不可或缺的一部分。...

深入理解 JSON 和 Form-data(json和formdata提交区别)

在讨论现代网络开发与API设计的语境下,理解客户端和服务器间如何有效且可靠地交换数据变得尤为关键。这里,特别值得关注的是两种主流数据格式:...

JSON 语法(json 语法 priority)

JSON语法是JavaScript语法的子集。JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔花括号保存对象方括号保存数组JS...

JSON语法详解(json的语法规则)

JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔大括号保存对象中括号保存数组注意:json的key是字符串,且必须是双引号,不能是单引号...

MySQL JSON数据类型操作(mysql的json)

概述mysql自5.7.8版本开始,就支持了json结构的数据存储和查询,这表明了mysql也在不断的学习和增加nosql数据库的有点。但mysql毕竟是关系型数据库,在处理json这种非结构化的数据...

JSON的数据模式(json数据格式示例)

像XML模式一样,JSON数据格式也有Schema,这是一个基于JSON格式的规范。JSON模式也以JSON格式编写。它用于验证JSON数据。JSON模式示例以下代码显示了基本的JSON模式。{"...

前端学习——JSON格式详解(后端json格式)

JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScriptProgrammingLa...

什么是 JSON:详解 JSON 及其优势(什么叫json)

现在程序员还有谁不知道JSON吗?无论对于前端还是后端,JSON都是一种常见的数据格式。那么JSON到底是什么呢?JSON的定义...

PostgreSQL JSON 类型:处理结构化数据

PostgreSQL提供JSON类型,以存储结构化数据。JSON是一种开放的数据格式,可用于存储各种类型的值。什么是JSON类型?JSON类型表示JSON(JavaScriptO...

JavaScript:JSON、三种包装类(javascript 包)

JOSN:我们希望可以将一个对象在不同的语言中进行传递,以达到通信的目的,最佳方式就是将一个对象转换为字符串的形式JSON(JavaScriptObjectNotation)-JS的对象表示法...

Python数据分析 只要1分钟 教你玩转JSON 全程干货

Json简介:Json,全名JavaScriptObjectNotation,JSON(JavaScriptObjectNotation(记号、标记))是一种轻量级的数据交换格式。它基于J...

比较一下JSON与XML两种数据格式?(json和xml哪个好)

JSON(JavaScriptObjectNotation)和XML(eXtensibleMarkupLanguage)是在日常开发中比较常用的两种数据格式,它们主要的作用就是用来进行数据的传...

取消回复欢迎 发表评论:

请填写验证码