Этот формат файла - это то, для чего был разработан модуль 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
объекты в противном случае могут быть использованы так же, как обычный словарь по остальной части кода.
Вы пробовали использовать csv? –