Python:将列追加到PrettyTable中的现有表

时间:2018-08-04 20:11:11

标签: python prettytable

假设我有以下代码:

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”,然后输入鞋子的类型。如何在不创建新表的情况下将此数据作为新列追加到表中?

**更新:

Result

Code

1 个答案:

答案 0 :(得分:0)

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

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

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

如果您真的只想将新添加的行的渲染内容添加到文本文件中,则似乎需要某种辅助函数来获取表中的总行数,因为我找不到任何PrettyTable API提供的方法。这样的功能可能看起来像这样:

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返回的表格呈现不会以一个结尾。