2013-07-15 4 views
2

У меня есть текстовый файл, сохраненный в блокноте, но перемещенный в мою папку python, которая имеет аббревиатуру из трех букв для страны на слева, а затем примерно четыре или пять пробелов справа имеет страну, которая соответствует ему так:Попытка сделать словарь python из файла, но я продолжаю получать ошибки, например, «слишком много значений для распаковки»

AFG Афганистан
ARM Армения
и т.д.

мне нужен словарь, чтобы использовать три буквы будут ключевым, а страна - Значение. В нем участвуют все страны, участвующие в Олимпийских играх. Вот что мой код выглядит до сих пор:

def country(fileName): 
    infile = open(fileName,'r') 
    countryDict = {} 
    for line in infile: 
     key,value = line.split() 
     countryDict[key] = value 
    print(countryDict) 
    return countryDict 
country('CountryCodes.txt') 

ответ

1

То, что происходит один из ваших строк в файле имеет более одного места, так что линия может выглядеть следующим образом:

hi hello hey 

При выполнении line.split() , вы получаете:

['hi', 'hello', 'hey'] 

Что вы пытаетесь присвоить двум переменным, но есть 3 элемента в списке. Таким образом, ошибка.

Чтобы избежать этого, вы должны либо уточнить раскол так это только раскалывает один раз, или разделить только один раз:

key, value = line.split(' ', 1) 

Или, если вы используете Python 3, вы можете распаковать остальные список до значения:

key, *value = line.split() 
6

скорее всего в некоторых странах (например, Новая Зеландия), имеют более одного слова в их именах и так split() возвращается более двух пунктов, но вы пытаетесь присвоить приводит к двум переменным независимо. Ограничьте split на один:

key, value = line.split(None, 1) 

Если вы обнаружите, что вы получаете лишний пробел в конце концов, бросить strip() там:

key, value = line.strip().split(None, 1) 
1

Один из ваших линий должны иметь более одного места так split() возвращает больше двух значений, ожидаемых key,value = line.split().

1

Некоторые страны будут иметь более чем одно слово как имя, так что вы в конечном итоге с несколькими полями значений, попробуйте:

def country(fileName): 
    infile = open(fileName,'r') 
    countryDict = {} 
    for line in infile: 
     key = line[0:3] 
     value = line[3:].strip() 
     countryDict[key] = value 
    print(countryDict) 
    return countryDict 
country('CountryCodes.txt') 
+0

ваш код компилируется и побежал, но когда у меня было напечатать это дало мне этот массивный блок странного кода: {'\ x00A \ x00': 'R \ x00E \ x00 \ t \ x00U \ x00N \ x00I \ x00T \ x00E \ x00D \ x00 \ x00A \ x00R \ x00A \ x00B \ x00 \ x00E \ x00M \ x00I \ x00R \ x00A \ x00T \ x00E \ x00S \ x00 ',' \ x00V \ x00 ':' I \ x00R \ x00 \ t \ x00V \ x00I \ x00R \ x00G \ x00I \ x00N \ x00 \ x00I \ x00S \ x00L \ x00A \ x00N \ x00D \ x00S \ x00 \ x00 (\ x00U \ x00. \ x00S \ x00. \ x00) \ x00 ',' \ x00 \ n ': –

+0

Это питон, поэтому он не компилируется, но он похоже, что вы hav e запустите его с двоичным файлом как CountryCodes.txt –

2

Похоже, что вы хотите разделить описание с кодом страны ...Ниже будет обслуживать пустые описания или описания более чем одного слова

with open('input') as fin: 
    country_lookup = dict(line.strip().partition(' ')[::2] for line in fin) 
2

Используйте эту удивительную функцию вместо:

def parse_country_codes(file_path): 
    with open(file_path) as f: 
     return dict(line.split(None, 1) for line in f if line) 
Смежные вопросы