微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

5分钟学会Python自动化运维必备:[花式]打印(二)

1 独孤求的Format

这一套功法,是小安老师自己一个人YY出来的,其中参考了MysqL的打印方式,下面来说下,这个功能是怎么实现的。

Example 1 :  初级"美颜"脚本

 1# -*- coding: GB18030 -*-
2
3"""
4  @author: 机智的安老师
5  @time:2019/4/27 11:04
6  """
7
8def print_tbs(conlist):
9    print("+{0:-<20}|{1:-<20}|{2:-<20}|{3:-<20}|{4:-<20}+".format("", "", "", "", ""))  # 居左对齐
10    print("|{0:^20}|{1:^20}|{2:^20}|{3:^20}|{4:^20}|".format("TABLESPACE_NAME", "sumMB", "usedMB", "freeMB","USED_PERCENT"))  # 居中对齐
11    print("+{0:-<20}|{1:-<20}|{2:-<20}|{3:-<20}|{4:-<20}+".format("-", "-", "-", "-", "-"))  # 居左对齐
12    for i in range(len(conlist)):
13        print("|{0:<20}|{1:<20}|{2:<20}|{3:<20}|{4:<20}|".format(*conlist[i]))  # 居左对齐
14    print("+{0:-<20}|{1:-<20}|{2:-<20}|{3:-<20}|{4:-<20}+".format("-", "-", "-", "-", "-"))  # 居左对齐
15    print("%d rows selected." % (len(conlist)))
16    print()
17
18if __name__ == '__main__':
19    tbsfreelist = [
20        ('USERS', 177.99, 169.70, 8.29, ' 95.34'),
21        ('sql_DATA', 248.65, 235.56, 13.09, ' 94.73'),
22        ('TEST_DATA', 546.68, 507.75, 38.92, ' 92.88'),
23        ('WORK_DATA', 328, 281.04, 46.95, ' 85.68'),
24        ('WORK_INDEX', 548.63, 468.34375, 80.29, ' 85.37'),
25        ('SYSAUX', 235.25, 200.66, 34.58, ' 85.30'),
26        ('SYstem', 241.31, 201.31, 45.21, ' 82.12')]
27    print_tbs(tbsfreelist)

代码详解  :  

第8行  :  定义函数print_tbs,参数为一个列表。

第9行  :  “ +{0:-<20}| ”,摘取这部分详解。开头是"+"号,然后自动补齐"-"至20位 ,补齐完毕,再输出一个"|"号。 打印结果为:"+--------------------|"

第10行  :  “ |{1:^20}| ”,摘取这部分详解。中间是"|"号,然后自动补齐"-"至20位 ,补齐完毕,再输出一个"|"号。 打印结果为:"|--------------------|"

第11行  :  “ |{4:-<20} +”,摘取这部分详解。中间是"|"号,然后自动补齐"-"至20位 ,补齐完毕,再输出一个"+"号。 打印结果为:"|--------------------+"

注意  :  第9行和第11行的Fortmat方式是不一样,没关系,主要输出不超20位,都是输出"-"号。

(ps :  请认真看第9行和第11行的format后面

图片

第10行  :  " .fortmat("列名") ",摘取这部分详解。列数量必须与前面的{}的数量一致,方可自动对号入座 !

第13行  :  " .format(*conlist[i])) " , *conlist[i]代表的是这个元组里的数量,若跟format前面的{}数量一致,则自动对号入座 !

第15行  :  "print("%d rows selected." % (len(conlist)))", 打印sql执行返回的行数,是非常重要的。作为一个自动生成的脚本,我们不可能自己动手去查,这里的返回行数是衡量这个自动化脚本是否可行的一个关键点!

Result 1 :  这结果,我看"型"。

图片

Example 2 :  中级"美颜"脚本

其实这个级别的美颜,不是说打印的方式有多漂亮,而是指初级的代码,还可以怎么优化,怎么写的更高级些。

部分关键代码

如需全部代码,可在公众号后台回复:"格式化代码",即可获取

1        for i in range(len(contlist)):  # 行长度
2            for j in range(len(contlist[i])):  # 列长度
3                if j < len(contlist[i]) - 1:
4                    print(f"|{contlist[i][j]:^20}", end="")
5                elif j == len(contlist[i]) - 1:
6                    # print("|{:^20}|".format(contlist[i][j]))
7                    print(f'|{contlist[i][j]:^20}|')

代码详解  :  

第1行  :  首先,要得知一个二维数组的MAX行,竖向输出

第2行  :  其次,要得知一个二维数组的MAX列,横向输出

第3/5行  :  j </= len(contlist[i]) - 1,如果这是J列的最后一个元素(J值等于MAX列-1),则要"|"收尾;否则,则为非最后一个元素(J值小于MAX列-1),不要"|",会画蛇添足。

第4行  :  " print(f"|{contlist[i][j]:^20}", end="") "将信息长度设定为20,f代表的就是 format。contlist[i][j]代表的是当前元素。

2 自带"美颜"的DataFrame

DataFrame是由一组数据和一对索引(行索引)组成的表格型数据结构,其数据形式的数据存储形式和Excel存储形式相近,由行索引和列索引确定唯一值。

Example 1 :  DataFrame的普通格式化方式

 1from pandas import DataFrame
2import pandas as pd
3import numpy as np
4
5# expand_frame_repr为False时,不允许换行,而认为True。 
6# 将该参数设置为False,可解决该问题:
7pd.set_option('expand_frame_repr',False)
8
9tbsfreelist = [
10    ('USERS', 177.99, 169.70, 8.29, ' 95.34'),
11    ('sql_DATAAAAAAAAAAAAAA', 248.65, 235.56, 13.09, ' 94.73'),
12    ('TEST_DATA', 546.68, 507.75, 38.92, ' 92.88'),
13    ('WORK_DATA', 328, 281.04, 46.95, ' 85.68'),
14    ('WORK_INDEX', 548.63, 468.34375, 80.29, ' 8500000000000000.37'),
15    ('SYSAUX', 235.25, 200.66, 34.58, ' 85.30'),
16    ('SYstem', 235.25, 200.66, 34.58, ' 85.30')
17]
18
19df = DataFrame(tbsfreelist, columns=["TABLESPACE_NAME", "sumMB", "usedMB", "freeMB", "USED_PERCENT"])
20
21print(df)

代码详解  :  

第19行  :  " DataFrame(tbsfreelist, columns= ..." DataFrame模块的方法,第一个参数是列表,第二个参数是列名。

Result 1  :  正如老铁们所见,无论我的列名长度和列值长度有多么不和谐,DataFrame输出的信息都是自动格式化好的!是不是挺好用?DataFrame还有很多种输出的格式,如有机会,定跟老铁们分享

图片


3 文本"强者"Terminaltables

从字符串列表列表中轻松绘制终端/控制台应用程序中的表。

Example 1  :  Terminaltables模块的用法其实非常简单,主要把列表往里面塞就可以了,自动就会按照像MysqL输出信息的方式进行格式化。

 1from terminaltables import AsciiTable
2
3def myPrint(colist,TABLE_DATA):
4    #table = AsciiTable(tbsfreelist)
5    #print(table.table)
6    TABLE_DATA.insert(0, colist)
7    #print(tbsfreelist)
8    title = '表空间使用率'
9    # AsciiTable.
10    table_instance = AsciiTable(TABLE_DATA, title)
11    #table_instance.justify_columns[2] = 'right'
12    print(table_instance.table)
13    print()
14
15
16if __name__ == '__main__':
17    colist = ["TABLESPACE_NAME", "sumMBaaaaaaaaaaaaaaaaaaaaa", "usedMB", "freeMB", "USED_PERCENT"]
18    tbsfreelist = [
19        ('USERS', 177.99, 169.70, 8.29, ' 95.34'),
20        ('sql_DATAAAAAAAAAAAAAA', 248.65, 235.56, 13.09, ' 94.73'),
21        ('TEST_DATA', 546.68, 507.75, 38.92, ' 92.88'),
22        ('WORK_DATA', 328, 281.04, 46.95, ' 85.68'),
23        ('WORK_INDEX', 548.63, 468.34375, 80.29, ' 85.300000000000000007'),
24        ('SYSAUX', 235.25, 200.66, 34.58, ' 85.30'),
25        ('SYstem', 235.25, 200.66, 34.58, ' 85.30')
26        ]
27
28    myPrint(colist,tbsfreelist)

代码详解  : 

 

第3行  :  myPrint 函数使用列名的列表 加上 表空间使用率的列表 作为参数。

第6行  :  将列名的列表插入表空间使用率数组的索引值为0的位置,方便我们观察每列信息的类型。

第8行  :  标记本次输出信息的是个啥玩意。

第10行  :  格式化输出信息,老铁们,有觉得这个模块的源码,其实就是小安老师(独孤求胜)源码的超高级版吗?所以说,学习Python千万不能闭门造车,已经很多高手在前面铺路,帮助我们更好地学习这门语言了!


Result 1 :  无论怎么更改列名/列值的长度,都依然能够美颜式输出

图片

4 文本"强者"Terminaltables 案例

以下代码都是在官网下载的,老铁们可自行上官网查找。如需全部代码,可在公众号后台回复:"格式化代码",即可获取

Example 1 :  以线条的粗细作为基准,格式化输出信息。

图片

Example 2 :  带有颜色的格式化,但是在CRT好像不怎么起作用 ! 本次使用vmare虚拟机内执行。

图片

Example 3 :  长文本输出,这个用的可能比较少 !

图片


版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐