5分钟学会Python自动化运维必备:[花式]打印(二)
作者:互联网
这一套功法,是小安老师自己一个人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]代表的是当前元素。
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还有很多种输出的格式,如有机会,定跟老铁们分享!
从字符串列表列表中轻松绘制终端/控制台应用程序中的表。
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 : 无论怎么更改列名/列值的长度,都依然能够美颜式输出!
以下代码都是在官网下载的,老铁们可自行上官网查找。如需全部代码,可在公众号后台回复:"格式化代码",即可获取!
Example 1 : 以线条的粗细作为基准,格式化输出信息。
Example 2 : 带有颜色的格式化,但是在CRT好像不怎么起作用 ! 本次使用vmare虚拟机内执行。
Example 3 : 长文本输出,这个用的可能比较少 !
标签:__,contlist,20,运维,Python,print,tbsfreelist,DATA,花式 来源: https://blog.51cto.com/15061934/2653771