我正在尝试从大型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命令将该字符串分为一个列表,但是我不能将列表中的项目转换为浮点数吗?
答案 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
类型,而只是将其转换为特定的评估值。
在第二种情况下,您正在比较str
和int
。请注意,当您使用constant = 1
时,常量的类型默认为int
,而不是float
。话虽如此,您正在比较int
和str
。对于此评估,您的代码将通过将字符串编码为int
来比较值。例如,在ASCII中,“ A”将被编码为65。根据所使用的编码,字符串将转换为整数表示形式,然后将其用于评估。
要解决您的问题,必须将值作为ch4
存储在float
中。可以通过ch4 = float(line.split(",")[4])
来完成,该操作会将值存储在float
变量中,而不是str
变量中。