简介
命令行下展示复杂的文本信息着实不易,今天给大家推荐一个不错的表格输出库prettytable,它可以打印出美观的表格,并能很好的支持中文显示。
安装
老规矩,通过pip
方式直接安装:
1 |
pip install prettytable |
示例
我们直接来看一个示例:
1 2 3 4 5 6 7 8 |
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 |
+----+-------+------+--------+ | 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']
作为表头,如果没有添加表头,那么会以默认的表头输出,如下:
1 2 3 |
+---------+---------+---------+---------+ | Field 1 | Field 2 | Field 3 | Field 4 | +---------+---------+---------+---------+ |
所以为了更直观的理解,还是要加上表头信息。
添加数据
按行添加数据
在上面的示例中,我们就使用了table.add_row()
方法按行添加了数据。需要注意的是添加的数据必须要是列表的形式,而且数据的列表长度要和表头的长度一样。在实际的使用中,我们应该注意数据是否与表头信息一致。
按列添加数据
使用table.add_column()
方法能够方便的按照列来添加数据,看下面的示例:
1 2 3 4 5 6 |
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 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文件读取数据的接口。
1 2 3 4 5 6 |
import prettytable as pt 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也是一样。
1 2 3 4 5 6 7 8 |
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) |
从HTML导入数据
示例如下:
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 |
import prettytable as pt html_string = '''<table> <tr> <th>No</th> <th>JOBID</th> <th>NAME</th> <th>STATUS</th> </tr> <tr> <td>1</td> <td>101</td> <td>job1</td> <td>R</td> </tr> <tr> <td>2</td> <td>102</td> <td>job2</td> <td>R</td> </tr> </table> ''' table = pt.from_html(html_string) print(table[0]) |
输出结果如下:
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())
得到如下结果:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
<table> <tr> <th>No</th> <th>JOBID</th> <th>NAME</th> <th>STATUS</th> </tr> <tr> <td>1</td> <td>101</td> <td>job1</td> <td>R</td> </tr> <tr> <td>2</td> <td>102</td> <td>job2</td> <td>R</td> </tr> </table> |
选择性输出
prettytable提供了诸如pandas一样的选择性输出。
指定输出的列
print(table.get_string(fields=['No', 'JOBID'])
指定输出这两列。
1 2 3 4 5 6 7 8 |
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 |
+----+-------+ | No | JOBID | +----+-------+ | 1 | 101 | | 2 | 102 | | 3 | 103 | | 4 | 104 | +----+-------+ |
切片输出
1 2 |
new_table = table[0:2] print(new_table) |
得到前两行的信息:
1 2 3 4 5 6 |
+----+-------+------+--------+ | No | JOBID | NAME | STATUS | +----+-------+------+--------+ | 1 | 101 | job1 | R | | 2 | 102 | job2 | R | +----+-------+------+--------+ |
输出排序
有时候我们需要对输出的表格进行排序,使用:
1 |
print(table.get_string(sortby='No', reversesort=True) |
其中reversesortreversesort
指定了是否倒序排列,默认为False。sortby
指定了排序的字段。
表格样式
内置样式
prettytable提供了多种内置的表格样式,比如MSWORD_FRIENDLY
,PLAIN_COLUMNS
,DEFAULT
等等,具体内置样式,可以参考官网自己尝试。
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) |
结果为:
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 | 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 |
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 |
$++++$+++++++$++++++$++++++++$ % 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库差不多。在命令行输出表格方面提供了不错的调用方式,使用非常灵活。