Python PrettyTable 模块学习 (格式化打印内容)

in #python7 years ago

今天在处理某些数据时,需要将数据显示出来。

结果我遇到一个问题,数据内容可以看成是一个表格,我在使用for循环逐行显示出来,显示出来的数据是这个样子:

好吧,如果我没有上年纪,眼睛又不花,并且有足够的时间和耐心,我觉得这数据还是有一点点意义的。但是如果遇到没有耐心的朋友,看到这坨数据,可能就会在心里不由自主地骂一句。

为了不被朋友骂,我将数据显示得漂漂亮亮的。那么如何才能让数据显示的漂亮一点呢?

放弃自己造轮子

我首先想到的是自己造轮子。比如说用\t,来分割数据。但是有时候一列里数据有长有短,那么可能有的需要\t两次,有的一次就够,那么我是不是要计算一下数据长度呢?短的就跳两次三次,长的则跳一次。然后是不是还有左对齐、右对齐的问题?那么我还是计算,然后通过在前边或者后边补空格实现对齐处理。还有加表头,分隔符等等等,好吧,我承认,我已经晕鸟。

既然自己造轮子,能力有限,造不出来,那么有没有现成的轮子可用呢?我记得无论是steempy还是uptick显示数据可都挺美观的。于是看了一下uptick中的代码,找到这样一句:
from prettytable import PrettyTable
原来它使用的是一个叫做PrettyTable的模块。

比如显示配置信息的时候:

代码看起来很简单嘛。

咱也试试

PrettyTable 安装以及使用

安装

使用以下命令安装PrettyTable
pip install prettytable

因为uptick已经帮我安装了这个,所以提示:

Requirement already satisfied: prettytable in ./venv/lib/python3.6/site-packages

使用

使用也很简单,我从这里找了个例子:

from prettytable import PrettyTable

# Initialize the object passing the table headers
t = PrettyTable(['A', 'B', 'C'])

t.align='l'
t.border=False

t.add_row([111,222,333])
t.add_row([444,555,666])
t.add_row(['longer text',777,'even longer text here'])
print str(t)

以上代码很好理解,先是导入模块设置表头,然后设置样式,然后逐行添加数据,然后显示。

Python3上需要把print str(t)改成print(str(t))
以上代码执行效果如下:

应用到自己程序里

学会了PrettyTable的使用以后,我就把它应用到我的代码里去。我的一坨内容终于变得漂漂亮亮了,你猜猜这是啥?

或许你看到我将PrettyTable应用到我的程序里很简单,实际上则是一波三折啊。

str转换

我的一坨代码之前都可以用print显示。但是将数据用t.add_row()的方式加进来以后,却提示出错。原因是print(var)会自动将其转换,而t.add_row([var1, var2])则不进行转换。

为了解决这个问题,需要进行类似t.add_row([str(var1), str(var2)])的处理。

格式设置

PrettyTable默认格式应该是居中,但是 Collateral和 Debt条目居中显示非常难以阅读。

于是我通过
t.align["Collateral"] = "r"
t.align["Debt"] = "r"
设置这两列为右对齐
然而无论我怎么试,它也不生效。我去搜索PrettyTable格式设置不生效,不起作用等等,搜了半天也没找到解决方案。

最后,当我打算放弃时,我发现原来是我一直在A.py上修改,然后运行的是B.py 😳

总结

  • 不要尝试自己制造轮子
  • PrettyTable 模块格式化打印内容非常简单简单好用
  • 遇到灵异事件时不要轻易放弃😳

参考链接

封面图源:https://pixabay.com

Sort:  

“在A.py上修改,然后运行的是B.py” 来握个手

@oflyhigh please translate to English version too, want to know about this. Thanks. Merry Xmas!

好厉害,这水平可以当黑客啦

is it binary ???

嗯,遇到灵异事件时不要轻易放弃,说不定是女神或仙女在招手呢~

i dont understand this language but i really appreciate for the hard work . good job

嗯,遇到灵异事件时不要轻易放弃,说不定是女神或仙女在招手呢~

遇到靈異事件,我通常都會先暈一會兒~

看着好复杂