当前位置: 首页 > 科技观察

实用,5个案例让Python输出漂亮的表格!

时间:2023-03-16 00:25:26 科技观察

1。前言最近在用python写一个小工具。这个工具主要用来管理各种资源的信息,比如阿里云的ECS等信息。因为我的工作电脑用的是LINUX,所以想用Python写一个命令行管理工具。基本功能是将阿里云资源的信息同步到数据库,然后使用命令行进行查询。因为信息是在命令行显示的,众所周知,在命令行显示复杂的文字似乎很累,所以我想像表格一样显示会舒服很多。prettytable库就是这样一个工具。prettytable可以打印出漂亮的表格,而且对中文的支持相当好(如果你自己尝试打印表格,你应该知道处理中文是多么的麻烦)注:本文是用Markdown语法写的,为了方便展示并复制,所以本文没有使用截图。由于格式控制的问题,文章中的运行结果会有一些分界线的偏差,在终端中显示出来就是为了解决这个问题。请手动验证。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导入表库表实例化创建了一个表库,并添加['number','cloudnumber','name','IPaddress']作为header,如果不添加header,则默认显示Field+number,例如:+---------+------------+------------+------------+|Field1|Field2|Field3|Field4|+--------+------------+---------+------------+so为了更直观的看到每一列的意思,还是需要加个header。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,否则无法运行。上面例子运行结果如下:+------+----------+--------+-----------+|ID|云ID|名称|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|server07|172.16.0.7||8|server08|server08|172.16.0.8||9|server09|服务器09|172.16.0.9|+------+----------+--------+------------+csv文件不能通过xls直接重命名,会报错。如果是xls文件,请使用saveascsv获取csv文件D.从sql中添加查询值。从数据库中查询出来的数据可以直接导入到表格中进行打印。下面的例子用的是sqlite3,用mysql也是一样的。如果可以查询到数据,可以导入到表中#!/usr/bin/python#**coding: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)结果如下:+------+----------+------------+------------+|编号|云ID|名称|IP地址|+-----+----------+----------+------------+|1|server01|server01|172.16.0.1||2|服务器02|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|server07|172.16.0.7||8|server08|server08|172.16.0.8||9|server09|server09|172.16.0.9|+-----+----------+------------+------------+E,从HTML导入数据支持从html表格导入,请看下面的例子:#!/usr/bin/python#**编码:utf-8**importsysfromprettytableimportPrettyTablefromprettytableimportfrom_htmlreload(sys)sys.setdefaultencoding('utf8')html_string='''

/tr>
number云数nameIP地址
1server01server01172.16.0.1
2server02server02172.16.0.2
'''table=from_html(html_string)print(table[0])结果如下:+------+----------+----------+-----------+|编号|云ID|名称|IP地址|+------+--------+--------+----------+|1|server01|server01|172.16.0.1||2|server02|server02|172.16.0.2|+------+----------+------------+------------+上面的例子中,我们可以导入htmltables,不同的是打印语句,使用htmltable时导入数据时,print必须是列表的第一个元素,否则可能会报[]之类的错误。这是因为该表不是PrettyTable对象,而是包含单个PrettyTable对象的列表。来自解析html,所以不能直接打印table,需要打印table[0]5。表格的输出格式就像支持多种输入一样,表格的输出也支持多种格式。我们在上面的例子中使用了print方法来输出,这是一种常用的输出方法。A.print通过print直接打印出表格。以这种方式打印的表格将有边框。B.以HTML格式输出表格print(table.get_html_string())可以打印出带有html标签的表格。在上面的示例中,使用print(table.get_html_string())将打印以下结果:/table>6。选择性输出prettytable在创建表之后,你仍然可以选择性地输出一些特定的行。A、输出指定列printtable.get_string(fields=["number","IPaddress"])可以输出指定列B,输出前两行。通过print(table.get_string(start=0,end=2))可以打印出指定的列。当然,开始和结束参数可以让我自由控制显示间隔。当然,区间包含开始,不包含结束。你熟悉这种用法吗?根据输出指定行和列的功能,我们可以指定同时输出行和列,这里不再赘述。C、从上面的输出范围中切出表格,我们做一个大胆的假设,由于范围包含start不包含end的规则和切片一样,我们可以通过切片生成一个新的表格,然后打印出来.其实可以。new_table=table[0:2]print(new_table)在上面的代码段中,我们可以从0到1行打印出一个2行的表格。Python的切片功能非常强大。有了切片,我们可以随意输入任意一行。D.输出排序有时我们需要对输出表进行排序。使用printtable.get_string(sortby="number",reversesort=True)对表进行排序,其中reversesort指定是否倒序排序,默认为False。即默认的正序排序。sortby指定要排序的字段。7.表格的样式A.内置样式可以通过set_style()来设置表格样式。Prettytable有多种内置样式。个人觉得MSWORD_FRIENDLY、PLAIN_COLUMNS、DEFAULT这三种风格看着清爽。在终端下显示表格看起来不错。很累,再加上几句花里胡哨的,就显得更累了。除了上面推荐的三种款式,还有一种款式不得不说,那就是RANDOM,也就是随机款式。每次打印都会随机选择一种内置样式,比较好玩。内置了几种样式,请参考官网自己尝试输出。#!/usr/bin/python#**编码:utf-8**importsysfromprettytableimportPrettyTablefromprettytableimportMSWORD_FRIENDLYfromprettytableimportPLAIN_COLUMNSfromprettytableimportRANDOMfromprettytableimportDEFAULTreload(sys)sys.setdefaultencoding('utf8')table=PrettyTable(['number',''name]address)'number'.add_row(['1','server01','server01','172.16.0.1'])table.add_row(['3','server03','server03','172.16.0.3'])table.add_row(['2','server02','server02','172.16.0.2'])table.add_row(['9','server09','server09','172.16.0.9'])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(['8','server08','server08','172.16.0.8'])table.add_row(['7','server07','server07','172.16.0.7'])table.set_style(DEFAULT)print(table)B、自定义样式PrettyTable除了内置的样式外,还提供了用户自定义的样式,比如对齐方式、数字输出格式、边框连接器等C、settingalignmentalign提供用户设置对齐方式,取值为l,r,c方便表示左对齐,右对齐和居中如果不设置,默认居中对齐。D.控制边框样式在PrettyTable中,边框由水平边框、垂直边框和边框连接符(横竖交叉的链接符号)三部分组成,如下所示:#!/usr/bin/python#**coding:utf-8**importsysfromprettytableimportPrettyTablereload(sys)sys.setdefaultencoding('utf8')table=PrettyTable(['number','cloudnumber','name','IPaddress'])table.add_row(['1','server01','server01','172.16.0.1'])table.add_row(['3','server03','server03','172.16.0.3'])table.add_row(['2','server02','server02','172.16.0.2'])table.add_row(['9','server09','server09','172.16.0.9'])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(['8','server08','server08','172.16.0.8'])table.add_row(['7','server07','server07','172.16.0.7'])table.align[1]='l'table.border=Truetable.junction_char='$'table.horizo??ntal_char='+'table.vertical_char='%'print(table)table.border`控制是否显示边框,默认为`Truetable.junction_char控制边框连接器table.horizo??ntal_char控制水平边框符号table.vertical_char控制垂直边框符号上面的例子运行如下:$++++++$++++++++++$++++++++++$++++++++++++$%number%云号%name%IP地址%$++++++$++++++++++$++++++++++$++++++++++++$%1%server01%server01%172.16.0.1%%3%server03%server03%172.16.0.3%%2%server02%server02%172.16.0.2%%9%server09%server09%172.16.0.9%%4%server04%server04%172.16.0.4%%5%server05%server05%172.16.0.5%%6%server06%server06%172.16.0.6%%8%server08%服务器08%172.16.0.8%%7%server07%Server07%172.16.0.7%$++++++$++++++++++$++++++++++$+++++++++++++$以上简单介绍了表格的一些常用样式设置。详情请参考官网

numbercloudnumbernameIP地址
1server01server01172.16.0.1172.16.0.1服务器td>
2server02server02172.16.0.2