无法将字符串数值转换为float

时间:2015-10-31 03:43:47

标签: python

我正在使用包含2列的CSV文件,第一个是格式为yyyymmdd的日期列,第二个是浮点格式的字符串值,例如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)

我通过使用type(rain_amount)继续检查rain_amount的类型,并且它一直注册为“str”。我究竟做错了什么?我一直在努力检查和做不同的事情,但我找不到问题。我肯定做错了什么,但我一直在看这个太长时间才弄明白。帮助

3 个答案:

答案 0 :(得分:3)

float()不会就地修改变量,它会返回新的类型值。将其分配回来:

rain_amount = float(rain_amount)

答案 1 :(得分:3)

float()函数更改其参数 - 它计算所需的适当浮点数并将其作为新对象返回,因此如果需要,您必须将其保存在某处使用它。如果您愿意,可以将float()调用与更新步骤结合使用,例如:

dec += float(rain_amount)

您可能想知道为什么 Python就是这样。

如Python Data model docs

中所述
  

对象的类型确定对象支持的操作   (例如,“它有长度吗?”)并且还定义了可能的值   对于那种类型的对象。 type()函数返回对象的类型   (这是一个对象本身)。与其标识一样,对象的类型是   也是不可改变的。

     

[脚注]在某些情况下 可以更改对象的类型   受控条件。但是,它通常不是一个好主意   如果处理不当,可能会导致一些非常奇怪的行为。

因此,一般来说,最好将对象的类型视为不可更改的。我们可能会随便谈论将字符串转换为浮点数,但这实际上只是说我们正在创建一个浮点对象,其数值对应于字符串对象的内容。

您不仅无法更改对象的类型,对于许多基本的Python对象类型,您甚至无法更改其值!这些对象称为 immutable ;常见的不可变类型包括所有数字类型,字符串和元组。除了元组之外,大多数内置容器类型(列表,字典和集合(但不是frozensets))都是可变的,这意味着可以修改其内容。

所以,如果你这样做

s = 'Sam'
s += 'my'

您实际上并未更改字符串对象s:您不能,因为它是不可变的。而是创建一个包含'Sammy'的新字符串对象,然后将新对象绑定到名称s,并丢弃包含'Sam'的旧对象。

同样,如果你这样做

a = 1
a += 1

创建一个新的整数对象,其值为a+1,并且该新对象绑定到名称a

有关此主题的更多信息,请参阅SO退伍军人Ned Batchelder的Facts and myths about Python names and values

答案 2 :(得分:1)

您没有存储更新的QCompleter类型。你必须把它归还。

这样做:

float