这种文件格式是csv
标准库中的模块旨在处理的。但是,您不能按照您想要的方式布置字典,因为字典键只能映射到一件事。解决该限制的一种简单方法是将每个电话号码映射到列表列表,如下面的示例代码和输出所示:
import csv
result = {}
with open('numbers.txt', 'rb') as input:
for phone_number, name, address in csv.reader(input):
if phone_number in result:
result[phone_number] += [[name, address]]
else:
result[phone_number] = [[name, address]]
print result
输出:
{'555-328382': [['john paul', '85 big road']],
'555-457645': [['zac fry', "45 tony's rd"], ['kim fry', "45 tony's rd"]],
'555-667282': [['bill higs', '67 hilltop']]}
内部for
循环中的代码可以通过使用另一个名为defaultdict
的标准库类来简化,该类是dict
. 每当引用不存在的值时,它们会自动将字典条目初始化为指定的默认值。以下是如何将其应用于此示例:
import collections
import csv
result = collections.defaultdict(list)
with open('numbers.txt', 'rb') as input:
for phone_number, name, address in csv.reader(input):
result[phone_number] += [[name, address]]
print result
第二版的输出:
defaultdict(<type 'list'>, {
'555-328382': [['john paul', '85 big road']],
'555-457645': [['zac fry', "45 tony's rd"], ['kim fry', "45 tony's rd"]],
'555-667282': [['bill higs', '67 hilltop']]})
defaultdict
否则,其他代码可以像使用常规字典一样使用对象。