为了练习如何更舒适、更流畅地使用字典,我编写了一个小程序,读取文件的内容,并将其作为键:值对添加到字典中。这没有问题,但当我好奇如何使用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