Невозможно преобразовать значение номера строки в float

Я работаю с CSV-файлом, который содержит 2 столбца, первый столбец даты с форматом yyyymmdd, второй – строковое значение, которое в формате float, например, 0.0.

import csv file = open('Precipitation.csv') date_file = csv.reader(file) dec = 0.0 for k in date_file: full_date = k[0] month = full_date[4:-2] rain_amount = k[1] float(month) if month == "12": float(rain_amount) dec += rain_amount print(dec) 

Я продолжаю проверять тип rain_amount, используя тип (rain_amount), и он продолжает регистрироваться как «str». Что я делаю не так? Я продолжаю пытаться проверять и делать разные вещи, но я не могу найти проблему. Я определенно делаю что-то неправильно, но я слишком долго смотрел на это, чтобы понять это. Помогите?

float() не изменяет переменную на месте, она возвращает новое типизированное значение. Назначьте его обратно:

 rain_amount = float(rain_amount) 

Функция float() не изменяет свой аргумент – он вычисляет необходимое число с плавающей запятой и возвращает это как новый объект, поэтому вам нужно сохранить это где-нибудь, если вы хотите его использовать. Если вам нравится, вы можете комбинировать вызов float() с этапом обновления, например:

 dec += float(rain_amount) 

Возможно, вам интересно, почему Python работает так.

Как упоминалось в документах модели данных Python

Тип объекта определяет операции, поддерживаемые объектом (например, «имеет ли он длину?»), А также определяет возможные значения для объектов этого типа. Функция type() возвращает тип объекта (который является самим объектом). Как и его идентичность, тип объекта также неизменен.

[Сноска] В некоторых случаях возможно изменение типа объекта в определенных контролируемых условиях. Однако это, как правило, не очень хорошая идея, поскольку это может привести к некоторому очень странному поведению, если оно обрабатывается неправильно.

Поэтому в целом лучше всего думать о типе объекта как неизменяемом. Мы можем небрежно говорить о преобразовании строки в float, но это действительно просто небрежный способ сказать, что мы создаем объект с плавающей точкой с числовым значением, соответствующим содержимому строкового объекта.

Вы не только не можете изменить тип объекта, но и для многих базовых типов объектов Python вы даже не можете изменить их значение! Такие объекты называются неизменяемыми ; общие неизменяемые типы включают все числовые типы, строки и кортежи. Помимо кортежей, большинство встроенных типов контейнеров (списки, словари и наборы (но не фризонсеты)) являются изменяемыми, то есть вы можете изменять их содержимое.

Так что если вы это сделаете

 s = 'Sam' s += 'my' 

Фактически вы не изменяете строковый объект s : вы не можете, потому что он неизменен. Вместо этого создается новый строковый объект, содержащий 'Sammy' , который затем привязывается к имени s , а старый объект, содержащий 'Sam' , отбрасывается.

Аналогичным образом, если вы это сделаете

 a = 1 a += 1 

создается новый целочисленный объект, который имеет значение a+1 и этот новый объект привязан к имени a .

Для получения дополнительной информации по этой теме, пожалуйста, см. Факты и мифы о именах и знаках Python ветеран SO Ned Batchelder.

Вы не сохраняете обновленный тип float . Вы должны назначить его обратно.

сделай это:

 rain_amount=float(rain_amount)