如何从字典中打印出格式良好的表格



为了练习如何更舒适、更流畅地使用字典,我编写了一个小程序,读取文件的内容,并将其作为键:值对添加到字典中。这没有问题,但当我好奇如何使用for循环以与数据文件中的表相同的格式再次打印内容时,我遇到了麻烦。

我的问题是:如何使用for循环将字典的内容打印到终端上

数据文件为:

Name    Age     School
Anne    10      Eiksmarka
Tom     15      Marienlyst
Vidar   18      Persbråten
Ayla    18      Kongshavn
Johanne 17      Wang
Silje   16      Eikeli
Per     19      UiO
Ali     25      NTNU

我的代码是:

infile = open("table.dat", "r")
data = {}
headers = infile.readline().split()
for i in range(len(headers)):
data[headers[i]] = []
for line in infile:
words = line.split()
for i in range(len(headers)):
data[headers[i]].append(words[i])
infile.close()

我希望输出将数据打印回终端。理想情况下,打印出来的东西应该像这样

Name    Age     School
Anne    10      Eiksmarka
Tom     15      Marienlyst
Vidar   18      Persbråten
Ayla    18      Kongshavn
Johanne 17      Wang
Silje   16      Eikeli
Per     19      UiO
Ali     25      NTNU

如果有人能帮我,我将不胜感激。

最简单的解决方案是使用Tabulate这样的库,您可以在这里找到一个输出示例(您可以进一步自定义它)

>>> from tabulate import tabulate
>>> table = [["Sun",696000,1989100000],["Earth",6371,5973.6],
...          ["Moon",1737,73.5],["Mars",3390,641.85]]
>>> print(tabulate(table))
-----  ------  -------------
Sun    696000     1.9891e+09
Earth    6371  5973.6
Moon     1737    73.5
Mars     3390   641.85
-----  ------  -------------

否则,如果你必须使用自己的自定义for循环,你可以添加标签来修复它的外观,如:

print(a+"t"),其中\t是水平制表转义符

编辑:下面是如何利用它的示例:

infile = open("table.dat", "r")
data = {}
headers = infile.readline().split()
for i in range(len(headers)):
data[headers[i]] = []
for line in infile:
words = line.split()
for i in range(len(headers)):
data[headers[i]].append(words[i])
print(words[i],end= 't')
print()
infile.close()

需要注意的事项:

1-对于每个字段,我们使用print(…,end='\t'),这会导致输出为制表符而不是新行,我们还可以考虑添加更多制表符(例如end='tt')或空格,或任何其他格式,如分隔符字符(例如`end='\t|\t')

2-在每行之后,我们使用print(),这将只打印一行新行,向下移动光标进行打印。

看看str.ljust.rjust.center方法,考虑下面的简单示例

d = {"Alpha": 1, "Beta": 10, "Gamma": 100, "ExcessivelyLongName": 1}
for key, value in d.items():
print(key.ljust(5), str(value).rjust(3))

输出

Alpha   1
Beta   10
Gamma 100
ExcessivelyLongName   1

请注意,ljust会添加(默认情况下)空格以获得指定的宽度,或者如果名称比指定的宽度长,则不执行任何操作。此外,由于值是整数,如果您想使用上述方法之一,则需要首先将其转换为str

您可以使用pandas来完成此操作,尽管它与您的样式不完全相同:

import pandas as pd
with open('filename.csv') as f:
headers, *data = map(str.split, f.readlines())
df = pd.DataFrame(dict(zip(headers, zip(*data)))
print(df.to_string(index=False))

Name Age     School
Anne  10  Eiksmarka
Tom  15 Marienlyst
Vidar  18 Persbråten
Ayla  18  Kongshavn
Johanne  17       Wang
Silje  16     Eikeli
Per  19        UiO
Ali  25       NTNU

相关内容

  • 没有找到相关文章

最新更新