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

How to print out nicely formatted tables from a dictionary

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

我的问题是:如何使用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 等库,您可以找到 here 输出示例(您可以进一步自定义)

>>> 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='\t\t') 或空格,或任何其他格式,例如分隔符(例如 `end='\t|\t')

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

查看 str.ljust, .rjust and .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 会添加(默认情况下)space 以获得指定的宽度,或者如果名称长于该宽度,则不执行任何操作,而且由于值是整数,因此需要先将其转换为 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