一个好用的轮子——美丽“表哥”(prettytable)

原文链接:http://www.juzicode.com/python-note-prretytable

在编写命令行程序时如果要输出表格,使用print()函数时通常需要花费大量的精力用在空格符和tab制表符的排版上。

我们先来看个例子,有一个包含3个字段的表格,需要用print打印出来:

head=['名字','年龄','公司']
table=[('桔子菌','30','桔子code有限责任公司'),
('橙子','20','橙子科技大学'),
('柚子','29','柚子街道办'),]

print(head[0],head[1],head[2])
for item in table:
    print(item[0],item[1],item[2])

运行结果:

可以看到显示的各个字段并没有对齐,不便于查看打印结果。

当然我们也可以通过增加制表符”\t”来改善显示效果:

head=['名字','年龄','公司']
table=[('桔子菌','30','桔子code有限责任公司'),
('橙子','20','橙子科技大学'),
('柚子','29','柚子街道办'),]
print(head[0],'\t',head[1],'\t',head[2])
for item in table:
    print(item[0],'\t',item[1],'\t',item[2])

运行结果:

可以看到,这样的输出结果看起来舒服多了。

但是当需要变化某个字段的长度,或者在后面再增加字段时,又会变得一团糟,比如下面例子中增加联系方式的字段、第2行内容的名字变长了:

head=['名字','年龄','公司','联系方式']
table=[('桔子菌','30','桔子code有限责任公司','VX公众号:juzicode'),
('橙子的徒弟的表哥','20','橙子科技大学','www.juzicode.com'),
('柚子','29','柚子街道办','10086'),]
print(head[0],'\t',head[1],'\t',head[2],'\t',head[3])
for item in table:
    print(item[0],'\t',item[1],'\t',item[2],'\t',item[3])

运行结果:

这个时候看到第2行内容因为增长的名字导致无法对齐了,联系方式这一列也无法对齐了,又得需要计算每个字段的长度重新调整制表符或者增加空格才能实现表格对齐了。

有没有现成的轮子可以用得上呢,答案当然是肯定的,今天出场的就是prettytable。它可以生成自动对齐的表格,无需用户过多的干预。

安装

我们可以通过pip安装:

pip install prettytable

基本功能

我们仍然用上面的例子,首先创建一个PrettyTable()实例,然后用表头列表赋值field_names属性,再使用add_row()方法添加一行内容,最后用print()打印这个实例:

head=['名字','年龄','公司','联系方式']
table=[('桔子菌','30','桔子code有限责任公司','VX公众号:juzicode'),
('橙子','20','橙子科技大学','www.juzicode.com'),
('柚子','29','柚子街道办','10086'),]    
from prettytable import PrettyTable
pt = PrettyTable()
pt.field_names = head
pt.add_row(table[0])
pt.add_row(table[1])
pt.add_row(table[2])
print(pt)


print()

head=['名字','年龄','公司','联系方式']
table=[('桔子菌','30','桔子code有限责任公司','VX公众号:juzicode'),
('橙子的徒弟的表哥','20','橙子科技大学软件工程学院','www.juzicode.com'),
('柚子','29','柚子街道办','10086'),]    
from prettytable import PrettyTable
pt = PrettyTable()
pt.field_names = head
pt.add_row(table[0])
pt.add_row(table[1])
pt.add_row(table[2])
print(pt)

运行结果:

可以看到无论如何变换字段内容的长度,都能应对自如。

强迫症患者瞬间舒服了。

调整对齐方式

上面的例子中每一列的内容都是中心对齐的,还可以通过设置align调整对齐方式:

from prettytable import PrettyTable

head=['名字','年龄','公司','联系方式']
table=[('桔子菌','30','桔子code有限责任公司','VX公众号:juzicode'),
('橙子','20','橙子科技大学','www.juzicode.com'),
('柚子','29','柚子街道办','10086'),]    
pt = PrettyTable()
pt.field_names = head
pt.add_row(table[0])
pt.add_row(table[1])
pt.add_row(table[2])

pt.align["名字"] = "l"  # 左对齐
pt.align["年龄"] = "c"  # 中心对齐,默认对齐方式
pt.align["公司"] = "r"  # 右对齐

print(pt)

运行结果:

设置显示内容

通过get_string()方法还可以调整显示内容,入参fields设置显示的列,start和end设置显示的行。其中start从0开始编号,显示到end-1行,注意第end行不显示:

from prettytable import PrettyTable

head=['名字','年龄','公司','联系方式']
table=[('桔子菌','30','桔子code有限责任公司','VX公众号:juzicode'),
('橙子','20','橙子科技大学','www.juzicode.com'),
('柚子','29','柚子街道办','10086'),]    
pt = PrettyTable()
pt.field_names = head
pt.add_row(table[0])
pt.add_row(table[1])
pt.add_row(table[2])

print(pt.get_string(fields=["名字", "年龄",'联系方式'], start=0, end=2)) # start从0开始编号,显示到end-1行的内容

运行结果:

设置边框样式

另外还可以通过修改horizontal_char等属性设置边框样式:

from prettytable import PrettyTable

head=['名字','年龄','公司','联系方式']
table=[('桔子菌','30','桔子code有限责任公司','VX公众号:juzicode'),
('橙子','20','橙子科技大学','www.juzicode.com'),
('柚子','29','柚子街道办','10086'),]    
pt = PrettyTable()
pt.field_names = head
pt.add_row(table[0])
pt.add_row(table[1])
pt.add_row(table[2])
pt.horizontal_char = '*'   # 横边框
pt.vertical_char = '@'     # 竖直边框
pt.junction_char='|'       # 边框连接符

print(pt)

运行结果:

好了,今天的prettytable就介绍到这里。

bug敲起来吧。

扩展阅读:

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注