1.前言最近在用Python写一个小工具。这个工具主要是用来管理各种资源的信息,比如阿里云的ECS等信息,因为我工作的电脑用的是LINUX,所以想用python写一个命令行管理工具。基本功能是将阿里云资源的信息同步到数据库,然后使用命令行进行查询。因为信息是在命令行显示的,众所周知,在命令行显示复杂的文字似乎很累,所以我想像表格一样显示会舒服很多。prettytable库就是这样一个工具,prettytable可以打印漂亮的表格,而且对中文的支持相当好(如果你自己尝试打印表格,你应该知道处理中文有多麻烦)2.安装prettytable不是内置的-在python库中,可以通过pipinstallprettytable安装。3.一个小例子先来看一个例子:#!/usr/bin/python#**coding:utf-8**importsysfromprettytableimportPrettyTablereload(sys)sys.setdefaultencoding('utf8')table=PrettyTable(['Number','云号','名称','IP地址'])table.add_row(['1','server01','server01','172.16.0.1'])table.add_row(['2','server02','server02','172.16.0.2'])table.add_row(['3','server03','server03','172.16.0.3'])table.add_row(['4','server04','server04','172.16.0.4'])table.add_row(['5','server05','server05','172.16.0.5'])table.add_row(['6','server06','server06','172.16.0.6'])table.add_row(['7','server07','server07','172.16.0.7'])table.add_row(['8','server08','server08','172.16.0.8'])table.add_row(['9','server09','server09','172.16.0.9'])print(table)上面例子的结果如下:linuxops@deepin:~$pythonp.py+-----+---------+---------+-------------+|number|云号|名称|IP地址|+-----+---------+---------+-------------+|1|server01|server01|172.16.0.1||2|server02|server02|172.16.0.2||3|server03|server03|172.16.0.3||4|server04|server04|172.16.0.4||5|server05|服务器05|172.16.0.5||6|server06|服务器06|172.16.0.6||7|server07|server07|172.16.0.7||8|server08|server08|172.16.0.8||9|server09|server09|172.16.0.9|+------+----------+------------+------------+在上面的例子中,我们通过form导入了表库table,并实例化了一个表库,并添加['number','cloudnumber','name','IPaddress']作为header,如果不添加header,则默认显示Field+number,例如:+---------+------------+------------+------------+|Field1|Field2|Field3|Field4|+--------+---------+---------+------------+所以对于为了更直观地看到每一列的含义,您仍然需要添加一个标题。4、添加数据prettytable提供了多种添加数据的方式,最常用的应该是按行按列添加数据。A.按行添加数据table.add_row在上面的简单例子中,我们按行添加数据。添加的数据必须是列表的形式,数据列表的长度必须与表头的长度相同。实际使用中要注意添加的数据是否对应表头,这一点很重要。B、按列添加数据table.add_column()看下面的例子:#!/usr/bin/python#**coding:utf-8**importsysfromprettytableimportPrettyTablereload(sys)sys.setdefaultencoding('utf8')table=PrettyTable()table.add_column('项目',['编号','云号','名称','IP地址'])table.add_column('value',['1','server01','server01','172.16.0.1'])print(table)结果如下:+--------+--------+------------+|index|item|value|+--------+--------+------------+|1|number|1||2|cloudnumber|server01||3|名称|服务器01||4|IP地址|172.16.0.1|+------+--------+------------+以上在示例中,我们使用add_column按列添加数据。按列添加数据在实例化表时不需要指定表头。添加列时指定其标题。table.add_column('project',['number','cloudnumber','name','IPaddress'])以这行代码为例,project指定该列的表头名称为“project”,['Number','cloudnumber','name','IPaddress']是列的值,也是一个列表。C.从csv文件中添加数据PrettyTable不仅提供了手动按行列添加数据,还支持直接从csv文件中读取数据。#!/usr/bin/python#**coding:utf-8**importsysfromprettytableimportPrettyTablefromprettytableimportfrom_csvreload(sys)sys.setdefaultencoding('utf8')table=PrettyTable()fp=open("res.csv","r")表=from_csv(fp)print(table)fp.close()如果要读取cvs文件数据,必须先导入from_csv,否则无法运行。上面例子的结果如下:PS:csv文件不能直接通过xls重命名,会报错。如果是xls文件,请另存为csv,获取csv文件D.从sql中添加查询值从数据库中查询到的数据可以直接导入到表格中进行打印。以下示例使用sqlite3。如果用mysql也是一样的,只要能查询到数据并导入到表单中即可。#!/usr/bin/python#**编码:utf-8**importsysfromprettytableimportPrettyTablefromprettytableimportfrom_db_cursorimportsqlite3reload(sys)sys.setdefaultencoding('utf8')conn=sqlite3.connect("/tmp/aliyun.db")cur=conn.cursor()cur.execute("SELECT*FROMres")table=from_db_cursor(cur)print(table)结果如下:+------+----------+-----------+------------+|编号|云号|名称|IP地址|+------+----------+---------+------------+|1|server01|server01|172.16.0.1||2|server02|server02|172.16.0.2||3|server03|server03|172.16.0.3||4|server04|server04|172.16.0.4||5|server05|server05|172.16.0.5||6|server06|server06|172.16.0.6||7|server07|服务器07|172.16.0.7||8|server08|服务器08|172.16.0.8||9|server09|服务器09|172.16.0.9|+------+----------+----------+------------+E。从HTML导入数据支持从html表格导入,请看下面的例子:#!/usr/bin/python#**coding:utf-8**importsysfromprettytableimportPrettyTablefromprettytableimportfrom_htmlreload(sys)sys.setdefaultencoding('utf8')html_string='''<表格>
number | cloudnumber | name | IP地址 | ||
---|---|---|---|---|---|
1 | server01 | server01 | 172.16.0.1 | 172.16.0.1 | 服务器td> |
2 | server02 | server02 | 172.16.0.2 |