假设我有以下代码:
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”,然后输入鞋子的类型。如何在不创建新表的情况下将此数据作为新列追加到表中?
**更新:
答案 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
返回的表格呈现不会以一个结尾。