Выдает ошибку (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-файлу это наверно так:
Я немножко переписал вашу программу,
- главным образом потому, что в ветвях
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
