Python:将列附加到 PrettyTable 中的现有表
Posted
技术标签:
【中文标题】Python:将列附加到 PrettyTable 中的现有表【英文标题】:Python: appending column to existing table in PrettyTable 【发布时间】:2019-01-12 07:50:55 【问题描述】:假设我有这个代码:
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】:您当前追加新输入数据的方法的问题是,呈现的表格的水平宽度可能会根据用户输入的字符串的长度而改变。因此,似乎不建议使用 a
(附加)标志打开该 .txt
文件,并且一旦将新数据添加到表中,您应该考虑重写整个文件。
为了向表中添加新行,您使用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
返回的表格渲染不会以一个结束。
【讨论】:
感谢您的详细解答。据我了解:我打开一个新文件附加到“test.txt”,分解我现有的表,获取我想附加到表中的字符串,然后重新组合表?原谅我,我有点糊涂。我在原始帖子中发布了我的结果(**更新)。 好吧,不要介意我的全部答案,因为我误读了您的问题,并认为您想追加一个新行,而您想添加一个新列。在这种情况下,您显然必须重写整个输出文件,因为其中的每一行都可能受到影响。您可以只覆盖整个内容,也可以只使用get_string(fields=['shoe'])
渲染表中新添加的列,使用.split('\n')
将其设为列表,并将其项目附加到文本文件中每一行的末尾.这仍然意味着您有效地重写了整个文件。以上是关于Python:将列附加到 PrettyTable 中的现有表的主要内容,如果未能解决你的问题,请参考以下文章
使用 withColumn 和 callUDF 将列附加到数据框
SQL Server:将列转换为另一个并将其值附加到单独的列