python显示表格_Python在命令行输出美观的表格

prettytable.png

简介

命令行下展示复杂的文本信息着实不易,今天给大家推荐一个不错的表格输出库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

R

1

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库差不多。在命令行输出表格方面提供了不错的调用方式,使用非常灵活。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值