#python
Вопрос:
with open(filename,'r') as input_file: csv_reader = csv.reader(input_file,delimiter = ',') for line_number, line in enumerate(csv_reader): if line_number == 0: # skip the header continue #if line[10] == '': #line.insert(10,0) my_dic.append({ 'First Name':line[11], 'Last name':line[13], 'Age(Years)':int(line[3]), 'Sex':line[18], 'type of car':line[16], 'Marital Status':line[14], 'Dependants':line[10], 'Yearly Salary':int(line[17]), 'Yearly Pension':int(line[15]), 'Company':line[5], 'Commuted Distance':float(line[4]), 'vehicle':{ 'Make':line[19], 'model':line[20], 'year':int(line[21]), 'category':line[22] }, 'Credit Card':{ 'Start Date':line[6], 'End Date':line[7], 'Card number':line[8], 'Card CCV':int(line[9]), 'iban':line[12] }, 'Address':{ 'Street':line[0], 'City':line[1], 'Postcode':line[2] } })
У меня есть приведенный выше код преобразования csv-файла в словарь, и я также хочу заменить пустые строки в столбце 10 набора данных. Если я удалю прокомментированный код (код, который пытается заменить пустую строку в столбце 10 (данных) номером), мой код сработает. Однако, если я удалю комментарий, он выдаст ошибку значения в ключе «годовая зарплата», которую я набираю в целые числа)
1.Как еще я могу заменить пустую строку в столбце на число (я не хочу использовать панд)
- Я также хочу знать строки, в которых происходит исправление
Комментарии:
1. Это правильно. Я должен был использовать оператор присваивания . В конечном итоге это не сработало с .. если строка[10]== Нет . Итак, я использовал if line[10]==» как написано, и он улавливает все строки с пустыми строками . Я догадался «отличается от» Нет » в python . Во-вторых, я намеревался использовать считыватель, а не диктофон, поэтому я индексировал цифры вместо имени столбца .
Ответ №1:
line.insert(10,0)
вставляет дополнительное значение в массив. Например, если массив был длиной 20, то после insert
этого он будет иметь длину 21. Вы получаете неправильные значения, и в позиции 17 вы получаете нецелочисленное значение.
Вы хотите заменить значение, а не вставить его.
line[10] = 0
Однако было бы легче понять код, если преобразование выполняется в самом словаре.
{ ... "Dependants": line[10] or 0, ... }
- Чтобы получить номер строки, самый простой способ-сохранить
line_number
его в некотором массиве… Например,
missing_data_on_dependants_row_idxs = list() for line_number, line in enumerate(csv_reader): if line_number == 0: # skip the header continue if line[10] is None: missind_data_on_dependants_row_idxs.append(line_number) ...
Кроме того, трудно понять, как ссылаться на столбцы по индексам. Вы рассматривали возможность использования csv.DictReader
?
Комментарии:
1. .Это верно. Я должен был использовать оператор присваивания . В конечном итоге это не сработало с if line[10]==Нет . Поэтому я использовал if line[10]==» как написано, и он ловит все строки с пустыми строками, как указано выше . Я догадался «отличается от» Нет » в python . Во-вторых, я намеревался использовать считыватель, а не диктофон, поэтому я индексировал цифры вместо имени столбца . Мой код больше не возвращает ошибку, но типизация, которую я сделал для иждивенцев после исправления, не преобразовала иждивенца в тип int в словаре . У меня все еще есть веревочка . Есть ли что-нибудь, что я могу сделать дальше ?
2.
'Dependants': int(line[10]),
может быть?