2016-02-06 3 views
2

У меня есть пример текста из Python, над которым я работаю.Python - ошибка индекса вне диапазона

Afghanistan:32738376 
    Akrotiri:15700 
    Albania:3619778 
    Algeria:33769669 
    American Samoa:57496 
    Andorra:72413 
    Angola:12531357 
    Anguilla:14108 
    Antigua and Barbuda:69842 
    Argentina:40677348 
    Armenia:2968586 
    Aruba:101541 
    Australia:20600856 
    Austria:8205533 
    Azerbaijan:8177717 

У меня есть этот код, чтобы сделать словарь, используя названия стран и населения.

dct = {} 
    for line in infile: 
    line = line.strip() 
    words = line.split(":") 
    countryname = words[0] 

    population = int(words[1]) 
    dct[countryname] = population 

Когда я печатать население, печатает все значения, но затем я получаю население = INT (слова [1]) - IndexError: индексный список из диапазона. Я не понимаю, как я получаю эту ошибку, особенно когда я печатаю название страны, это абсолютно нормально, ошибка возникает только с населением. Python должен получать одинаковое количество строк для обеих переменных, но, похоже, популяция пытается получить доступ к большему количеству строк, чего я не понимаю, потому что это не делает этого для countryname. Любые идеи о том, почему это происходит.

+4

У вас, вероятно, есть пустая строка или так, чтобы сплит не производил второй элемент. попробуйте распечатать каждую строку (или просмотреть ее с помощью отладчика), а затем исправить свой код для размещения в строке нарушения. вы можете проверить, находится ли ':' в строке до разделения и если не пропустить эту строку. что-то вроде этого – Eran

+0

Невозможно воспроизвести. – Idos

ответ

1

Вы предполагаете, что ваш файл совершенен, и это неправильно.

try: 
    countryname = words[0] 
    population = int(words[1]) 
    dct[countryname] = population 
except IndexError: 
    print("Impossible convert line: %s " % line) 

Я предпочитаю использовать журнал, чем утверждение печати в этом случае, но ради примера, я думаю, что это нормально. Вы также должны напечатать номер строки, если хотите.

В любом случае цель try/except заключается в том, чтобы избежать разрыва программы, когда файл не учитывает формат, который вы имеете в виду.

1

Могут быть линии без разделителя :. Попробуйте поймать его

dct = {} 
    for line in infile: 
    line = line.strip() 
    words = line.split(":") 
    countryname = words[0] 

    population = 0 
    if words.__len__() > 1: 
     population = int(words[1]) 

    dct[countryname] = population 
+0

не использовать слова .__ len __() но len (слова) – Eran

0

Пожалуйста Проверьте содержимое файла, кажется где-то в файле «:» отсутствует между названием страны и населения:

rfile = open('a.txt', 'rw') 
print dict([line.strip().split(':')for line in rfile.readlines()]) 
0

Я рекомендовал бы добавить следующее диагностики в код:

dct = {} 
for line_number, line in enumerate(infile): 
    line = line.strip() 
    words = line.split(":") 

    if len(words) != 2: 
     print "Line {} is not correctly formatted - {}".format(line_number, line) 
    else: 
     countryname = words[0] 
     population = int(words[1]) 
     dct[countryname] = population 

Это позволило бы показать, какие строки номера в данных имеют проблемы форматирования, было бы показать что-то вроде:

Line 123 is not correctly formatted - Germany8205534 
Line 1234 is not correctly formatted - Hungary8205535 
Смежные вопросы