简介
命令行下展示复杂的文本信息着实不易,今天给大家推荐一个不错的表格输出库prettytable,它可以打印出美观的表格,并能很好的支持中文显示。
安装
老规矩,通过pip方式直接安装:
pip install prettytable
1
pipinstallprettytable
示例
我们直接来看一个示例:
import prettytable as pt
table = pt.PrettyTable(['No', 'JOBID', 'NAME', 'STATUS'])
table.add_row(['1', '101', 'job1', 'R'])
table.add_row(['2', '102', 'job2', 'R'])
table.add_row(['3', '103', 'job3', 'R'])
table.add_row(['4', '104', 'job4', 'R'])
print(table)
1
2
3
4
5
6
7
8
importprettytableaspt
table=pt.PrettyTable(['No','JOBID','NAME','STATUS'])
table.add_row(['1','101','job1','R'])
table.add_row(['2','102','job2','R'])
table.add_row(['3','103','job3','R'])
table.add_row(['4','104','job4','R'])
print(table)
结果为:
+----+-------+------+--------+
| No | JOBID | 名字 | STATUS |
+----+-------+------+--------+
| 1 | 101 | job1 | R |
| 2 | 102 | job2 | R |
| 3 | 103 | job3 | R |
| 4 | 104 | job4 | R |
+----+-------+------+--------+
1
2
3
4
5
6
7
8
+----+-------+------+--------+
|No|JOBID|名字|STATUS|
+----+-------+------+--------+
|1|101|job1|R|
|2|102|job2|R|
|3|103|job3|R|
|4|104|job4|R|
+----+-------+------+--------+
在上面的例子中,我们首先导入了prettytable库,然后通过PrettyTable实例化一个叫table的对象。并且我们将['No', 'JOBID', 'NAME', 'STATUS']作为表头,如果没有添加表头,那么会以默认的表头输出,如下:
+---------+---------+---------+---------+
| Field 1 | Field 2 | Field 3 | Field 4 |
+---------+---------+---------+---------+
1
2
3
+---------+---------+---------+---------+
|Field1|Field2|Field3|Field4|
+---------+---------+---------+---------+
所以为了更直观的理解,还是要加上表头信息。
添加数据
按行添加数据
在上面的示例中,我们就使用了table.add_row()方法按行添加了数据。需要注意的是添加的数据必须要是列表的形式,而且数据的列表长度要和表头的长度一样。在实际的使用中,我们应该注意数据是否与表头信息一致。
按列添加数据
使用table.add_column()方法能够方便的按照列来添加数据,看下面的示例:
import prettytable as pt
table = pt.PrettyTable()
table.add_column('No', [i for i in range(1, 5)])
table.add_column('JOBID', [i for i in range(101, 105)])
print(table)
1
2
3
4
5
6
importprettytableaspt
table=pt.PrettyTable()
table.add_column('No',[iforiinrange(1,5)])
table.add_column('JOBID',[iforiinrange(101,105)])
print(table)
输出结果为:
+----+-------+
| No | JOBID |
+----+-------+
| 1 | 101 |
| 2 | 102 |
| 3 | 103 |
| 4 | 104 |
+----+-------+
1
2
3
4
5
6
7
8
+----+-------+
|No|JOBID|
+----+-------+
|1|101|
|2|102|
|3|103|
|4|104|
+----+-------+
按列添加数据不需要再实例化表格时添加表头,而是在添加列的时候加入。比如在table.add_column('No', [i for i in range(1, 5)])中,指定了表头为‘No’,列值为[1, 2, 3, 4, 5]。需要注意的是即使列表里面的值不是字符串,也能按照字符串格式显示。
从CSV文件添加数据
PrettyTable提供了从csv文件读取数据的接口。
import prettytable as pt
table = pt.PrettyTable()
data = open('finthon.csv', 'r')
table = pt.from_csv(data)
print(table)
data.close()
1
2
3
4
5
6
importprettytableaspt
table=pt.PrettyTable()
data=open('finthon.csv','r')
table=pt.from_csv(data)
print(table)
data.close()
如果要读取csv文件,使用from_csv()方法。需要注意的是,csv文件不能通过xls直接重命名得到,否则会报错。请使用另存为csv文件的方式。在使用pandas库的时候也一样。
从sql查询值添加
从数据库查询的数据也能够直接通过表格打印出来,下面的例子使用了sqlite3,对于mysql也是一样。
import prettytable as pt
import sqlite3
conn = sqlite3.connect('/tmp/finthon.db')
cur = conn.cursor()
cur.execute('SELECT * FROM res')
table = from_db_cursor(cur)
print(table)
1
2
3
4
5
6
7
8
importprettytableaspt
importsqlite3
conn=sqlite3.connect('/tmp/finthon.db')
cur=conn.cursor()
cur.execute('SELECT * FROM res')
table=from_db_cursor(cur)
print(table)
从HTML导入数据
示例如下:
import prettytable as pt
html_string = '''
No JOBID NAME STATUS 1 101 job1 R 2 102 job2 R'''
table = pt.from_html(html_string)
print(table[0])
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
importprettytableaspt
html_string='''
No JOBID NAME STATUS 1 101 job1 R 2 102 job2 R'''
table=pt.from_html(html_string)
print(table[0])
输出结果如下:
+----+-------+------+--------+
| No | JOBID | NAME | STATUS |
+----+-------+------+--------+
| 1 | 101 | job1 | R |
| 2 | 102 | job2 | R |
+----+-------+------+--------+
1
2
3
4
5
6
+----+-------+------+--------+
|No|JOBID|NAME|STATUS|
+----+-------+------+--------+
|1|101|job1|R|
|2|102|job2|R|
+----+-------+------+--------+
在上面的示例中,我们通过from_html()方法导入html的内容,在使用print函数打印时需要注意必须是table[0]。这是因为table并不是PrettyTable的对象,而是包含单个PrettyTable对象的列表,通过html解析而来,所以无法直接打印table,而需要打印table[0]。
表格输出格式
prettytable库不仅提供了多种输入格式,还支持多种输出格式,
print()方法
在上面的例子中我们都是使用print()方法输出。这种输出方式打印出来的表格会带边框。
输出HTML格式
print(table.get_html_string())可以打印出html标签的表格。在上面的例子中,使用print(table[0].get_html_string())得到如下结果:
No JOBID NAME STATUS 1 101 job1 R 2 102 job2 R1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
No JOBID NAME STATUS 1 101 job1 R 2 102 job2 R选择性输出
prettytable提供了诸如pandas一样的选择性输出。
指定输出的列
print(table.get_string(fields=['No', 'JOBID'])指定输出这两列。
import prettytable as pt
table = pt.PrettyTable(['No', 'JOBID', 'NAME', 'STATUS'])
table.add_row(['1', '101', 'job1', 'R'])
table.add_row(['2', '102', 'job2', 'R'])
table.add_row(['3', '103', 'job3', 'R'])
table.add_row(['4', '104', 'job4', 'R'])
print(table.get_string(fields=['No', 'JOBID']))
1
2
3
4
5
6
7
8
importprettytableaspt
table=pt.PrettyTable(['No','JOBID','NAME','STATUS'])
table.add_row(['1','101','job1','R'])
table.add_row(['2','102','job2','R'])
table.add_row(['3','103','job3','R'])
table.add_row(['4','104','job4','R'])
print(table.get_string(fields=['No','JOBID']))
结果为:
+----+-------+
| No | JOBID |
+----+-------+
| 1 | 101 |
| 2 | 102 |
| 3 | 103 |
| 4 | 104 |
+----+-------+
1
2
3
4
5
6
7
8
+----+-------+
|No|JOBID|
+----+-------+
|1|101|
|2|102|
|3|103|
|4|104|
+----+-------+
切片输出
new_table = table[0:2]
print(new_table)
1
2
new_table=table[0:2]
print(new_table)
得到前两行的信息:
+----+-------+------+--------+
| No | JOBID | NAME | STATUS |
+----+-------+------+--------+
| 1 | 101 | job1 | R |
| 2 | 102 | job2 | R |
+----+-------+------+--------+
1
2
3
4
5
6
+----+-------+------+--------+
|No|JOBID|NAME|STATUS|
+----+-------+------+--------+
|1|101|job1|R|
|2|102|job2|R|
+----+-------+------+--------+
输出排序
有时候我们需要对输出的表格进行排序,使用:
print(table.get_string(sortby='No', reversesort=True)
1
print(table.get_string(sortby='No',reversesort=True)
其中reversesortreversesort指定了是否倒序排列,默认为False。sortby指定了排序的字段。
表格样式
内置样式
prettytable提供了多种内置的表格样式,比如MSWORD_FRIENDLY,PLAIN_COLUMNS,DEFAULT等等,具体内置样式,可以参考官网自己尝试。
table = pt.PrettyTable(['No', 'JOBID', 'NAME', 'STATUS'])
table.add_row(['1', '101', 'job1', 'R'])
table.add_row(['2', '102', 'job2', 'R'])
table.add_row(['3', '103', 'job3', 'R'])
table.add_row(['4', '104', 'job4', 'R'])
table.set_style(pt.MSWORD_FRIENDLY)
print(table)
table.set_style(pt.PLAIN_COLUMNS)
print(table)
1
2
3
4
5
6
7
8
9
table=pt.PrettyTable(['No','JOBID','NAME','STATUS'])
table.add_row(['1','101','job1','R'])
table.add_row(['2','102','job2','R'])
table.add_row(['3','103','job3','R'])
table.add_row(['4','104','job4','R'])
table.set_style(pt.MSWORD_FRIENDLY)
print(table)
table.set_style(pt.PLAIN_COLUMNS)
print(table)
结果为:
| No | JOBID | NAME | STATUS |
| 1 | 101 | job1 | R |
| 2 | 102 | job2 | R |
| 3 | 103 | job3 | R |
| 4 | 104 | job4 | R |
No JOBID NAME STATUS
1 101 job1 R
2 102 job2 R
3 103 job3 R
4 104 job4 R
1
2
3
4
5
6
7
8
9
10
11
|No|JOBID|NAME|STATUS|
|1|101|job1|R|
|2|102|job2|R|
|3|103|job3|R|
|4|104|job4|R|
NoJOBIDNAMESTATUS
1101job1R
2102job2R
3103job3R
4104job4R
自定义样式
除了内置样式以外,我们还可以自定义样式,包括对齐方式,数字输出格式,边框连接符等等。
如下所示:
import prettytable as pt
table = pt.PrettyTable(['No', 'JOBID', 'NAME', 'STATUS'])
table.add_row(['1', '101', 'job1', 'R'])
table.add_row(['2', '102', 'job2', 'R'])
table.add_row(['3', '103', 'job3', 'R'])
table.add_row(['4', '104', 'job4', 'R'])
table.align[1] = 'l'
table.border = True
table.junction_char = '$'
table.horizontal_char = '+'
table.vertical_char = '%'
print(table)
1
2
3
4
5
6
7
8
9
10
11
12
13
importprettytableaspt
table=pt.PrettyTable(['No','JOBID','NAME','STATUS'])
table.add_row(['1','101','job1','R'])
table.add_row(['2','102','job2','R'])
table.add_row(['3','103','job3','R'])
table.add_row(['4','104','job4','R'])
table.align[1]='l'
table.border=True
table.junction_char='$'
table.horizontal_char='+'
table.vertical_char='%'
print(table)
结果为:
$++++$+++++++$++++++$++++++++$
% No % JOBID % NAME % STATUS %
$++++$+++++++$++++++$++++++++$
% 1 % 101 % job1 % R %
% 2 % 102 % job2 % R %
% 3 % 103 % job3 % R %
% 4 % 104 % job4 % R %
$++++$+++++++$++++++$++++++++$
1
2
3
4
5
6
7
8
9
10
11
12
13
$++++$+++++++$++++++$++++++++$
%No%JOBID%NAME%STATUS%
$++++$+++++++$++++++$++++++++$
%1%101%job1%R%
%2%102%job2%R%
%3%103%job3%R%
%4%104%job4%R%
$++++$+++++++$++++++$++++++++$
table.align可以设置对齐的方式,值有'l','r','c'分别代表左对齐,右对齐和居中对齐,默认为居中对齐。
table.border控制是否显示边框,默认为True
table.horizontal_char控制横边框样式
table.vertical_char控制竖边框样式
总结
prettytable使用习惯和pandas库差不多。在命令行输出表格方面提供了不错的调用方式,使用非常灵活。