2011-12-07 83 views
30

我运行以下Python脚本:ValueError异常:无法将字符串转换为float:ID

#!/usr/bin/python 

import os,sys 
from scipy import stats 
import numpy as np 

f=open('data2.txt', 'r').readlines() 
N=len(f)-1 
for i in range(0,N): 
    w=f[i].split() 
    l1=w[1:8] 
    l2=w[8:15] 
    list1=[float(x) for x in l1] 
    list2=[float(x) for x in l2] 
    result=stats.ttest_ind(list1,list2) 
    print result[1] 

但是我得到了这样的错误:

ValueError: could not convert string to float: id 

我对这个困惑。 当我尝试一下本作只有一个互动栏目线,而不是为循环使用的脚本:

>>> from scipy import stats 
>>> import numpy as np 
>>> f=open('data2.txt','r').readlines() 
>>> w=f[1].split() 
>>> l1=w[1:8] 
>>> l2=w[8:15] 
>>> list1=[float(x) for x in l1] 
>>> list1 
[5.3209183842, 4.6422726719, 4.3788135547, 5.9299061614, 5.9331108706, 5.0287087832, 4.57...] 

我工作得很好。

任何人都可以解释一下这个吗? THX

回答

27

显然你的一些线路没有有效的float数据,特别是一些线路上有文字id不能转换为浮动。

当您在交互式提示中尝试它时,您只尝试第一行,因此最好的方法是打印出现此错误的行,并且您将知道错误行,例如

#!/usr/bin/python 

import os,sys 
from scipy import stats 
import numpy as np 

f=open('data2.txt', 'r').readlines() 
N=len(f)-1 
for i in range(0,N): 
    w=f[i].split() 
    l1=w[1:8] 
    l2=w[8:15] 
    try: 
     list1=[float(x) for x in l1] 
     list2=[float(x) for x in l2] 
    except ValueError,e: 
     print "error",e,"on line",i 
    result=stats.ttest_ind(list1,list2) 
    print result[1] 
+6

这有助于捕获csv文件中的空字符串。 –

7

此错误是相当详细:在文本文件中

ValueError: could not convert string to float: id 

某处,一行中有字id,不能真正被转换为数字。

您的测试代码有效,因为在line 2中不存在单词id


如果你想捕捉那条线,试试这段代码。我清理你的代码了一点点:

#!/usr/bin/python 

import os, sys 
from scipy import stats 
import numpy as np 

for index, line in enumerate(open('data2.txt', 'r').readlines()): 
    w = line.split(' ') 
    l1 = w[1:8] 
    l2 = w[8:15] 

    try: 
     list1 = map(float, l1) 
     list2 = map(float, l2) 
    except ValueError: 
     print 'Line {i} is corrupt!'.format(i = index)' 
     break 

    result = stats.ttest_ind(list1, list2) 
    print result[1] 
3

您的数据可能不是您所期望的 - 看起来您期待的是,但没有获得浮动。

搞清楚一个简单的解决方案,这种情况是添加一个try /除了for循环:

for i in range(0,N): 
    w=f[i].split() 
    l1=w[1:8] 
    l2=w[8:15] 
    try: 
     list1=[float(x) for x in l1] 
     list2=[float(x) for x in l2] 
    except ValueError, e: 
     # report the error in some way that is helpful -- maybe print out i 
    result=stats.ttest_ind(list1,list2) 
    print result[1] 
12

我的错误是非常简单的:包含数据的文本文件,有一些空间(所以不可见)字符在最后一行。
作为grep的输出,我有45 而不是只有45

经典的愚蠢的事情,让你浪费时间。 :-)

+1

空格和制表符是可见的;)行尾和类似符号不是,例如,字符'\ n','\ r'。 –

0

也许你的数字不是实际的数字,而是字母伪装成数字?

就我而言,我使用的字体意味着“l”和“1”看起来非常相似。我有一个像'l1919'这样的字符串,我认为它是'11919',这让事情变得很糟糕。

相关问题