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

How to add new rows to already printed table in console?

我的脚本需要在 c运行ching 一些数字时打印 table。它的总 运行 时间是几个小时,我需要它在 运行ning 时向打印的 table 添加越来越多的行。我正在尝试使用 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 |
+-------+-----+

有没有办法在每次添加一行时不打印整个 table,而是只在已打印内容的下方打印一个新行?我想得到这样的东西:

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

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

您可以打印最后两行:

print t[-2:]

要将 Name 字段设置为左对齐,只需使用 align 样式选项:

t.align['Name'] = 'l'
print t
+-------+-----+
| Name  | Age |
+-------+-----+
| Alice |  24 |
| Bob   |  19 |
+-------+-----+

要在每个条目之间打印一行 +-----+-----+,请将 hrules 样式选项设置为 1:

t.hrules = 1
print t
+-------+-----+
| Name  | Age |
+-------+-----+
| Alice |  24 |
+-------+-----+
| Bob   |  19 |
+-------+-----+

如果你不想每次都打印页眉,你可以将 header 样式选项设置为 False

t.header = False
print t
+-------+----+
| Alice | 24 |
+-------+----+
| Bob   | 19 |
+-------+----+

PrettyTable Tutorials Wiki

中有几个很好的例子可以涵盖您的问题,还有更多可用的例子

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

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 |
+---------------------+--------+

您可以做的是在每次打印前清洁屏幕并每次重新绘制整个 table。我认为结果会非常接近您描述的结果,您可以试试这个:

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("3c")
    print(t)
    time.sleep(1)

神奇的是print("3c"),我不确定table这是怎么回事,如果它不起作用,您可以查看清除特定系统终端的方法。

你可以这样做:

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 |
+-------+-----+