浮点转换失败for循环(python)

时间:2018-10-26 12:36:47

标签: python csv for-loop

我正在尝试从大型csv文件(〜1e6行)中提取异常数据点,其中大多数数据点处于恒定值。我已经编写了下面的代码来检测小于常数的值。

constant = 1
try:
    fp = open('disk2.csv')
    for line in fp: 
        ch4 = float(line.split(",")[4]) #data from channel four is in the fifth column
        if ch4 < constant:
            print line.split(",")[0] #print first column

except:
    ch4 = 'Not found'
finally:
    fp.close()
    print(ch4,type(ch4))

打印返回以下内容,没有其他错误:

('Not found', <type 'str'>)

如果我将代码更改为:

constant = 1
try:
    fp = open('disk2.csv')
    for line in fp: 
        ch4 = line.split(",")[4] #data from channel four is in the fifth column
        if ch4 < constant:
            print line.split(",")[0] #print first column

except:
    ch4 = 'Not found'
finally:
    fp.close()
    print(ch4,type(ch4))

返回

(' 2.41650E+01', <type 'str'>)

因此,csv文件被读取为字符串,并且可以使用split命令将该字符串分为一个列表,但是我不能将列表中的项目转换为浮点数吗?

该错误不在代码中,而是在我的CSV文件中,该文件在第一行中没有足够的内容

2 个答案:

答案 0 :(得分:1)

直接比较浮点数通常是一个不好的做法。最好使用这样的东西:

abs(float(ch4), constant) <= allowed_error

其中allowed_error是一个较小的值,例如0.000001。浮点数与整数的存储方式不同,1.0的内部可以是0.9999999或1.000001。

答案 1 :(得分:0)

在第一种情况下,您将与值进行比较,并将格式从str更改为float,以进行比较,就像if float(ch4) < constant一样。请注意,您并不是将值存储为float类型,而只是将其转换为特定的评估值。

在第二种情况下,您正在比较strint。请注意,当您使用constant = 1时,常量的类型默认为int,而不是float。话虽如此,您正在比较intstr。对于此评估,您的代码将通过将字符串编码为int来比较值。例如,在ASCII中,“ A”将被编码为65。根据所使用的编码,字符串将转换为整数表示形式,然后将其用于评估。

要解决您的问题,必须将值作为ch4存储在float中。可以通过ch4 = float(line.split(",")[4])来完成,该操作会将值存储在float变量中,而不是str变量中。