IndexError: list index out of range. Не могу понять, из за чего выкидывает ошибку
При вызове метода выкидывает ошибку IndexError: list index out of range Не могу понять, из за чего выдает ошибку.
Traceback (most recent call last):
File "C:/Users/User/PycharmProjects/Classes/classes.py", line 101, in <module>
print(get_car_list('file_csv.csv'))
File "C:/Users/User/PycharmProjects/Classes/classes.py", line 79, in get_car_list
car_params = row[0].split(';')
IndexError: list index out of range
Метод:
def get_car_list(path):
car_list = []
with open(path, 'r') as file:
csv_file = csv.reader(file)
for row in csv_file:
car_params = row[0].split(';')
if car_params[0] == 'car':
car = Car(brand=car_params[1],
passenger_seats_count=car_params[2],
photo_file_name=car_params[3],
carrying=car_params[5])
car_list.append(car)
elif car_params[0] == 'truck':
car = Truck(brand=car_params[1],
photo_file_name=car_params[3],
body_whl=car_params[4],
carrying=car_params[5])
car_list.append(car)
elif car_params[0] == 'spec_machine':
car = SpecMachine(brand=car_params[1],
photo_file_name=car_params[3],
carrying=car_params[5],
extra=car_params[6])
car_list.append(car)
return car_list
Содержимое CSV файла:
car_type;brand;passenger_seats_count;photo_file_name;body_whl;carrying;extra
car;Nissan xTtrail;4;f1.jpeg;;2.5;
truck;Man;;f2.png;8x3x2.5;20;
truck;Man;;f2.png;;20;
car;Mazda 6;4;f3.jpeg;;2.5;
;;;
spec_machine;Hitachi;;f4;;1.2;Легкая техника для уборки снега
Полный код:
import os
import csv
class CarBase:
photo_file_names = ['.jpg', '.jpeg', '.gif', '.png']
def get_photo_file_ext(self):
if os.path.splitext(self.photo_file_name)[1] in self.photo_file_names:
return os.path.splitext(self.photo_file_name)[1]
else:
return False
def __init__(self, brand, carrying, photo_file_name,):
self.brand = brand
self.photo_file_name = photo_file_name
try:
self.carrying = float(carrying)
except TypeError as err:
print(err)
else:
self.carrying = carrying
class Car(CarBase):
def __init__(self, brand, carrying, photo_file_name, passenger_seats_count):
super().__init__(brand, carrying, photo_file_name)
self.car_type = 'car'
try:
self.passenger_seats_count = int(passenger_seats_count)
except TypeError as error:
print(error)
else:
self.passenger_seats_count = int(passenger_seats_count)
def get_body_lwh(in_lwh):
lwh = in_lwh.split('x')
if len(lwh) != 3:
lwh.clear()
for i in range(3):
lwh.append(0)
return lwh
else:
try:
for i in range(3):
lwh[i] = float(lwh[i])
return lwh
except ValueError:
for i in range(3):
lwh.append(0)
return lwh
class Truck(CarBase):
def __init__(self, brand, carrying, photo_file_name, body_whl):
super().__init__(brand, carrying, photo_file_name)
self.body_length = get_body_lwh(body_whl)[0]
self.body_width = get_body_lwh(body_whl)[1]
self.body_height = get_body_lwh(body_whl)[2]
self.car_type = 'truck'
def get_body_value(self):
return self.body_length * self.body_width * self.body_height
class SpecMachine(CarBase):
def __init__(self, brand, carrying, photo_file_name, extra):
super().__init__(brand, carrying, photo_file_name)
self.extra = extra
self.car_type = 'spec_machine'
def get_car_list(path):
car_list = []
with open(path, 'r') as file:
csv_file = csv.reader(file)
for row in csv_file:
print(row)
print(type(row))
car_params = row[0].split(';')
if car_params[0] == 'car':
car = Car(brand=car_params[1],
passenger_seats_count=car_params[2],
photo_file_name=car_params[3],
carrying=car_params[5])
car_list.append(car)
elif car_params[0] == 'truck':
car = Truck(brand=car_params[1],
photo_file_name=car_params[3],
body_whl=car_params[4],
carrying=car_params[5])
car_list.append(car)
elif car_params[0] == 'spec_machine':
car = SpecMachine(brand=car_params[1],
photo_file_name=car_params[3],
carrying=car_params[5],
extra=car_params[6])
car_list.append(car)
return car_list
if __name__ == '__main__':
print(get_car_list('file_csv.csv'))
Ответы (2 шт):
Не знаю, у меня Ваш код из вопроса полностью работает вот в такой интерпретации
Собственно я сам ваш код и не менял, только дописал то, чего не хватало для того, чтобы его у себя запустить
import csv
from collections import namedtuple
SpecMachine = namedtuple(
'SpecMachine',
[
'brand',
'photo_file_name',
'carrying',
'extra'
]
)
Car = namedtuple(
'Car',
[
'brand',
'passenger_seats_count',
'photo_file_name',
'carrying'
]
)
Truck = namedtuple(
'Truck',
[
'brand',
'photo_file_name',
'body_whl',
'carrying'
]
)
def get_car_list(path):
car_list = []
with open(path, 'r', encoding='utf-8') as file:
csv_file = csv.reader(file)
for row in csv_file:
car_params = row[0].split(';')
if car_params[0] == 'car':
car = Car(brand=car_params[1],
passenger_seats_count=car_params[2],
photo_file_name=car_params[3],
carrying=car_params[5])
car_list.append(car)
elif car_params[0] == 'truck':
car = Truck(brand=car_params[1],
photo_file_name=car_params[3],
body_whl=car_params[4],
carrying=car_params[5])
car_list.append(car)
elif car_params[0] == 'spec_machine':
car = SpecMachine(brand=car_params[1],
photo_file_name=car_params[3],
carrying=car_params[5],
extra=car_params[6])
car_list.append(car)
return car_list
if __name__ == '__main__':
print(get_car_list('test.csv'))
# [Car(brand='Nissan xTtrail', passenger_seats_count='4', photo_file_name='f1.jpeg', carrying='2.5'), Truck(brand='Man', photo_file_name='f2.png', body_whl='8x3x2.5', carrying='20'), Truck(brand='Man', photo_file_name='f2.png', body_whl='', carrying='20'), Car(brand='Mazda 6', passenger_seats_count='4', photo_file_name='f3.jpeg', carrying='2.5'), SpecMachine(brand='Hitachi', photo_file_name='f4', carrying='1.2', extra='Легкая техника для уборки снега')]
Входные данные тоже не менял, вот содержимое test.csv:
car_type;brand;passenger_seats_count;photo_file_name;body_whl;carrying;extra
car;Nissan xTtrail;4;f1.jpeg;;2.5;
truck;Man;;f2.png;8x3x2.5;20;
truck;Man;;f2.png;;20;
car;Mazda 6;4;f3.jpeg;;2.5;
;;;
spec_machine;Hitachi;;f4;;1.2;Легкая техника для уборки снега
Думаю, что проблема в данных находящихся вне того примера который Вы дали. Для того, чтобы попробовать решить проблему, желательно иметь ту часть данных при обработке которых возникает исключение.
Проблема решена. Оказывается цикл читал пустые строки в csv файле и после этого выкидывал out of range. Всем спасибо!