转换为float时出错

时间:2011-07-28 13:46:56

标签: python csv

我正在尝试使用csv.DictReader

读取文件

我有一个应该是整数的字段。如果它是空的,我会将其设置为DEFAULT 如果它是一个整数我什么也不做。如果它不是一个整数,我检查它是否是一个带引号的整数(like '1234')。如果是这样我将它转换为整数.Else引发一个异常。

如果它是空的,或者它是一个整数,它按预期工作。如果它是带引号的整数(like '1234'),则会引发异常integer invalid literal for float(): '1234'

在这种情况下不应该引发异常。

我认为它与DictReader读取csv文件的方式有关。 Everyhting else就好了。请帮忙

 if not line[key]:
    line[key]='DEFAULT'
 elif not isinstance(line[key], (int, long, float)) :                        
    try:
      line[key]=float(line[key])
    except Exception,e :
      print e

3 个答案:

答案 0 :(得分:4)

问题是单引号是字符串的一部分:

In [7]: float("'1234'")
ValueError: invalid literal for float(): '1234'

如果删除它们,事情应该有效:

In [8]: float("'1234'".strip("'"))
Out[9]: 1234.0

答案 1 :(得分:1)

这可能不是最聪明的方法,但如果你想确保字符串中只有数字,你可以删除所有非数字。

>>> import string
>>> extract = lambda s, charset: "".join(c for c in s if c in charset)
>>> float( extract("'h0424.234\"foo", string.digits + ".") )
424.234

答案 2 :(得分:0)

如果您的文字类似于“'1234'”或“1234”和“1234”,您可以在转换前使用替换:

data = ["'1234'", '"1234"', '1234', '', 1234]
[float(str(a).replace("'","").replace('"','')) if str(a).strip() else 'DEFAULT' for a in data]