如何在控制台中为已打印的表添加新行?

时间:2017-04-12 15:54:59

标签: python prettytable

我的脚本需要在处理某些数字时打印一个表。它的总运行时间是几个小时,我需要它在打印表运行时添加越来越多的行。我正在尝试使用PrettyTable,但我愿意接受其他建议如何实现。这是我想要做的一个例子:

from prettytable import PrettyTable
t = PrettyTable(['Name', 'Age'])
t.add_row(['Alice', 24])
print t

#do some work

t.add_row(['Bob', 19])
print t

我得到的结果是:

+-------+-----+
|  Name | Age |
+-------+-----+
| Alice |  24 |
+-------+-----+
+-------+-----+
|  Name | Age |
+-------+-----+
| Alice |  24 |
|  Bob  |  19 |
+-------+-----+

有没有办法在每次添加行时都不打印整个表格,而只打印已经打印过的新行?我想尝试这样的事情:

+-------+-----+
|  Name | Age |
+-------+-----+
| Alice |  24 |
+-------+-----+
| Bob   |  19 |
+-------+-----+

第一列的左对齐将是一个很好的奖励。

4 个答案:

答案 0 :(得分:2)

下面的代码涵盖了您所要求的所有内容如果您在列名称定义中指定了足够的SPACES以覆盖所有传入项目的最大宽度(感谢此问题的所有贡献者 - 我已经使用了此处提供的所有内容在下面提供的代码中):

from __future__ import print_function

from prettytable import PrettyTable
t = PrettyTable(['Name               ', '   Age'])
t.align['Name               '] = 'l'
t.align['   Age'] = 'r'
t.hrules = 1
t.add_row(['Alice', 24])
print(t)

#do some work

t.add_row(['Bob', 19])
print( "\n".join(t.get_string().splitlines()[-2:]) )

#do some work

t.add_row(['AliceInWonderland', 1019])
print( "\n".join(t.get_string().splitlines()[-2:]) )

这里上面代码生成的输出也适用于" AliceInWonderland" 1019岁:D:

+---------------------+--------+
| Name                |    Age |
+---------------------+--------+
| Alice               |     24 |
+---------------------+--------+
| Bob                 |     19 |
+---------------------+--------+
| AliceInWonderland   |   1019 |
+---------------------+--------+

答案 1 :(得分:2)

你可以这样做:

print "\n".join(t.get_string().splitlines()[-2:])

用此替换脚本的最后一行会产生您想要的结果:

+-------+-----+
|  Name | Age |
+-------+-----+
| Alice |  24 |
+-------+-----+
|  Bob  |  19 |
+-------+-----+

正如grr所说,您也可以使用t.align['Name'] = 'l'左对齐名称列。

+-------+-----+
|  Name | Age |
+-------+-----+
| Alice |  24 |
+-------+-----+
| Bob   |  19 |
+-------+-----+

答案 2 :(得分:1)

您可以使用以下方式打印最后两行

region.y

要将print t[-2:] 字段设置为左对齐,只需使用Name样式选项:

align

要在每个条目之间打印一行t.align['Name'] = 'l' print t +-------+-----+ | Name | Age | +-------+-----+ | Alice | 24 | | Bob | 19 | +-------+-----+ ,请将+-----+-----+样式选项设置为1:

hrules

如果您不想在每次将t.hrules = 1 print t +-------+-----+ | Name | Age | +-------+-----+ | Alice | 24 | +-------+-----+ | Bob | 19 | +-------+-----+ 样式选项设置为header时打印标题。

False

有几个很好的例子可以涵盖您所要求的内容以及PrettyTable Tutorials Wiki

中提供的内容。

答案 3 :(得分:0)

您可以做的是在每次打印前清洁屏幕并每次重绘整个表格。我认为结果将与您描述的非常接近,看看您可以尝试这样做:

import time
from prettytable import PrettyTable

t = PrettyTable(['Name', 'Age'])
t.add_row(['Alice', 24])

for _ in range(10):
    t.add_row(['Alice', 24])
    print("\033c")
    print(t)
    time.sleep(1)

神奇的是print("\033c"),我不确定这是多么便携,如果它不起作用,你可以找到清除特定系统终端的方法。