如何从字典中打印出格式良好的表格
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
为了练习如何更舒适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