Python:将列附加到 PrettyTable 中现有的 table
Python: appending column to existing table in 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()
当我第一次写入文件时,当要求创建一个新的 table 时,我输入 "N",输入 "cat" 表示动物,输入 "Honda" 表示汽车得到这个结果:
+--------+-------+
| animal | car |
+--------+-------+
| cat | Honda |
+--------+-------+
如果我想将数据(鞋子)附加到文件中,我会在系统询问时 select "A",然后输入鞋子的类型。如何在不创建全新 table 的情况下将此数据作为新列附加到 table?
**更新:
您当前追加新输入数据的方法存在的问题是呈现的 table 的水平宽度可能会根据用户输入的字符串的长度而改变。因此,使用 a
(附加)标志打开 .txt
文件似乎不可取,一旦新数据添加到 [=38],您应该考虑重写整个文件=].
为了向 table 添加新行,您使用 add_row
方法并传递包含列值的列表,例如:
t.add_row(['shoe', shoe])
如果您真的真的只想将新添加的行的呈现附加到您的文本文件,您似乎需要某种辅助函数来获取 table 中的总行数,如我找不到 PrettyTable
API 提供的任何方法。这样的函数可能如下所示:
table_rows = lambda t: len(t.get_string().split('\n'))-4
它简单地计算 table 的漂亮渲染中由其 get_string
方法返回的行数,并减去 3 行用于 header,1 用于底部线。请注意,一旦您覆盖 table 的 hrules
属性,这个 非常 天真的实现就会崩溃,所以不要像为此,您应该自己跟踪 table 的总行数(每次添加新行时分配 total_rows += 1
)!但只要您不更改任何关于呈现的基本假设,您就可以使用此函数来确定要从中呈现 table:
的行索引
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)
这样,您可以让库呈现 table 仅显示最新行,然后沿着换行符将其分解,这样您就可以使用列表切片摆脱 header ([-2:]
).您可以使用 '\n'.join()
调用将生成的单行列表重新组合为包含换行符的单个字符串。当您将结果附加到文本文件时,您需要先插入一个换行符,因为 get_string
返回的 table 渲染不会以一个结束。
假设我有这个代码:
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()
当我第一次写入文件时,当要求创建一个新的 table 时,我输入 "N",输入 "cat" 表示动物,输入 "Honda" 表示汽车得到这个结果:
+--------+-------+
| animal | car |
+--------+-------+
| cat | Honda |
+--------+-------+
如果我想将数据(鞋子)附加到文件中,我会在系统询问时 select "A",然后输入鞋子的类型。如何在不创建全新 table 的情况下将此数据作为新列附加到 table?
**更新:
您当前追加新输入数据的方法存在的问题是呈现的 table 的水平宽度可能会根据用户输入的字符串的长度而改变。因此,使用 a
(附加)标志打开 .txt
文件似乎不可取,一旦新数据添加到 [=38],您应该考虑重写整个文件=].
为了向 table 添加新行,您使用 add_row
方法并传递包含列值的列表,例如:
t.add_row(['shoe', shoe])
如果您真的真的只想将新添加的行的呈现附加到您的文本文件,您似乎需要某种辅助函数来获取 table 中的总行数,如我找不到 PrettyTable
API 提供的任何方法。这样的函数可能如下所示:
table_rows = lambda t: len(t.get_string().split('\n'))-4
它简单地计算 table 的漂亮渲染中由其 get_string
方法返回的行数,并减去 3 行用于 header,1 用于底部线。请注意,一旦您覆盖 table 的 hrules
属性,这个 非常 天真的实现就会崩溃,所以不要像为此,您应该自己跟踪 table 的总行数(每次添加新行时分配 total_rows += 1
)!但只要您不更改任何关于呈现的基本假设,您就可以使用此函数来确定要从中呈现 table:
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)
这样,您可以让库呈现 table 仅显示最新行,然后沿着换行符将其分解,这样您就可以使用列表切片摆脱 header ([-2:]
).您可以使用 '\n'.join()
调用将生成的单行列表重新组合为包含换行符的单个字符串。当您将结果附加到文本文件时,您需要先插入一个换行符,因为 get_string
返回的 table 渲染不会以一个结束。