1

假设我有这个代码:

from prettytable import PrettyTable

f = open("test.txt", "w")

t = PrettyTable()

def main():
    animal = input("Enter an animal: ")
    car = input("Enter a car: ")
    column_names = ["animal", "car"]
    t.add_column(column_names[0], [animal])
    t.add_column(column_names[1], [car])
    table_txt = t.get_string()
    with open("test.txt", "w") as file:
        file.write(table_txt)

def append():
    shoe = input("Enter a shoe: ")
    table_txt = t.get_string()
    with open("test.txt", "a") as file:
        file.write(table_txt)



cnt = input("Are you appending, or submitting new data? A for APPEND, N for NEW: ")
if cnt == 'N':
    main()
else:
    if cnt == 'A':
        append()
f.close()

当我第一次写入文件时,当被要求创建一个新表时,我输入“N”,然后输入“cat”表示动物,输入“Honda”表示汽车并得到以下结果:

+--------+-------+
| animal |  car  |
+--------+-------+
|  cat   | Honda |
+--------+-------+

如果我想将数据(鞋)附加到文件中,我会在询问时选择“A”,然后输入鞋的类型。如何在不创建全新表的情况下将此数据作为新列附加到表中?

**更新:

结果

代码

4

1 回答 1

0

您当前追加新输入数据的方法的问题在于,呈现的表格的水平宽度可能会根据用户输入的字符串的长度而改变。因此,似乎不建议.txt使用 (append) 标志打开该文件,a一旦将新数据添加到表中,您应该考虑重写整个文件。

为了向表中添加新行,您使用该add_row方法并传递包含列值的列表,例如:

t.add_row(['shoe', shoe])

如果您真的只想将新添加的行的渲染附加到您的文本文件中,您似乎需要某种辅助函数来获取表中的总行数,因为我找不到提供的任何方法PrettyTableAPI 。这样的函数可能如下所示:

table_rows = lambda t: len(t.get_string().split('\n'))-4

它只是计算其get_string方法返回的表格的漂亮渲染中的行数,并减去三行作为标题行,减去一行作为底部行。请注意,一旦您覆盖表的属性,这个非常hrules幼稚的实现就会中断,因此,您应该自己跟踪表的总行数(total_rows += 1每次添加新行时分配),而不是像这样进行噱头!但只要您不更改任何有关渲染的基本假设,您就可以使用此函数来确定要从中渲染表格的行索引:

table_txt = t.get_string(start=table_rows(t)-1)
row_txt = '\n'.join(table_txt.split('\n')[-2:])
with open("test.txt", "a") as file:
    file.write("\n" + table_txt)

这样,您可以让库呈现一个仅显示最新行的表格,然后您可以沿换行符将其拆分,这样您就可以使用列表切片 ( ) 摆脱标题[-2:]'\n'.join()您可以使用调用将生成的单行列表重新组合成一个包含换行符的字符串。当您将结果附加到您的文本文件时,您需要先插入一个换行符,因为返回的表格呈现get_string不会以一个终止。

于 2018-08-04T21:40:15.853 回答