2015-10-31 2 views
3

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

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), и он продолжает регистрацию в качестве «ул.» Что я делаю не так? Я продолжаю пытаться проверять и делать разные вещи, но я не могу найти проблему. Я определенно делаю что-то неправильно, но я слишком долго смотрел на это, чтобы понять это. Помогите?

ответ

3

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

rain_amount = float(rain_amount) 
1

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

сделать это:

rain_amount=float(rain_amount) 
3

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

dec += float(rain_amount) 

Вы можете быть удивлены, почему Python работает так.

Как уже упоминалось в Python Data model docs

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

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

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

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

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

s = 'Sam' 
s += 'my' 

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

Точно так же, если вы

a = 1 
a += 1 

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

Для получения дополнительной информации по этой теме, пожалуйста, см. Facts and myths about Python names and values от SO veteran Ned Batchelder.

+0

+1 для: * «но это действительно просто небрежный способ сказать, что мы создаем объект с плавающей точкой с числовым значением, соответствующим содержимому строкового объекта» * –

Смежные вопросы