Выдает ошибку (IndexError: list index out of range на 18 строке) при попытке выбрать второй элемент строки из файла cvs

import csv

list = []

with open('games.csv', 'r') as csvfile:
    reader = csv.DictReader(csvfile)

    for row in reader:
        cond = int(row['white_rating']) - int(row['black_rating'])

        if -100 <= cond <= 100 and row['winner'] == 'white':
            move = str(row['moves'])
            move = move.split()[0]
            list.append(move)

        elif -100 <= cond <= 100 and row['winner'] == 'black':
            move = str(row['moves'])
            move = move.split()[1]
            list.append(move)


print(len(list))

CVS файл здесь.


Ответы (1 шт):

Автор решения: MarianD

Потому что мы не имеем права доступа к вашему файлу, я могу только гадать:

move = str(row['moves'])

В переменной move будет строка, в которой не находится ни один сепаратор (пробел или табулятор).

Потому в последующей команде (на строке 18)

move = move.split()[1]

часть move.split() даст список только с одним элементом (его индекс 0), а элемент с индексом 1 не существует.


Допольнение:

После получения доступа к вашему CSV-файлу это наверно так:

  • В строке 13703 в столбце М (заголовок moves) находится только d3:

    введите сюда описание изображения


Я немножко переписал вашу программу,

  • главным образом потому, что в ветвях if и else делаете практически то же самое, разница только в индексе (0 или 1),
  • и добавил выявление ошибок:
import csv

list = []
WB_IDX = {'white': 0, 'black': 1}

with open('games.csv') as csvfile:
    reader = csv.DictReader(csvfile)

    for i, row in enumerate(reader, start=2):                # i: номер строки
        cond = (int(row['white_rating']) 
              - int(row['black_rating']))
        winner = row['winner']

        if -100 <= cond <= 100 and winner in WB_IDX:
            move = row['moves']                              # не надо str()
            if ' ' not in move:
                print('*** Ошибка в строке №', i)
                continue                         # переход на следующую строку CSV-файла
            move = move.split()[WB_IDX[winner]]
            list += [move]

print(len(list))

Вывод:

*** Ошибка в строке № 13703
*** Ошибка в строке № 18585
8670
→ Ссылка