2011-12-07 7 views
30

estoy ejecutando el siguiente script en Python:ValueError: no pudo convertir cadena a flotar: Identificación del

#!/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] 

Sin embargo me dieron los errores como:

ValueError: could not convert string to float: id 

Estoy confundido por esto. cuando intento esto por sólo una línea en la sección interactiva, en lugar de usar la escritura de bucle:

>>> 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...] 

que funciona bien.

¿Alguien puede explicar un poco sobre esto? THX

Respuesta

27

Obviamente algunas de sus líneas no tienen datos válidos flotador, específicamente alguna línea de texto tiene id que no se puede convertir a flotar.

Cuando intenta en el indicador interactivo, está intentando solo la primera línea, así que la mejor manera es imprimir la línea donde está recibiendo este error y sabrá la línea incorrecta, p.

#!/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

Esto fue útil para capturar una cadena vacía en un archivo csv. –

7

Este error es bastante detallado:

ValueError: could not convert string to float: id 

En algún lugar en el archivo de texto, una línea tiene la palabra id en ella, que realmente no se puede convertir en un número.

Su código de prueba funciona porque la palabra id no está presente en line 2.


Si desea tomar esa línea, intente con este código. Me limpiado su código hasta un poco:

#!/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

Sus datos pueden no ser los que espera, parece que está esperando, pero no consigue, flota.

Una solución sencilla para averiguar dónde ocurre esto sería añadir un try/excepto para el ciclo 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

Mi error fue muy simple: el archivo de texto que contiene los datos tenía algún espacio (tan no visible) carácter en la última línea.
Como salida de grep, tuve 45  en lugar de solo 45.

Lo clásico estúpido que te hace perder horas. :-)

+1

Los espacios y las pestañas son visibles;) Al final de las líneas y alikes no están, por ejemplo, los caracteres '\ n',' \ r'. –

0

¿Quizás sus números no son en realidad números, sino letras enmascaradas como números?

En mi caso, la fuente que estaba usando significaba que "l" y "1" se veían muy similares. Tuve una cuerda como 'l1919' que pensé que era '11919' y eso estropeó las cosas.

Cuestiones relacionadas