2011-12-07 10 views
30

sto correndo il seguente script python:ValueError: non poteva convertire la stringa a stare a galla: 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] 

Tuttavia ho ottenuto gli errori come:

ValueError: could not convert string to float: id 

Sono confuso da questo. Quando provo questo per una sola riga nella sezione interattiva, invece di ciclo for usando script:

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

mi funziona bene.

Qualcuno può spiegare un po 'di questo? thx

risposta

27

Ovviamente alcune delle vostre linee non hanno dati float validi, in particolare qualche linea di testo hanno id che non può essere convertito a stare a galla.

Quando lo provi nel prompt interattivo, stai provando solo la prima riga, quindi il modo migliore è stampare la riga in cui ricevi questo errore e conoscerai la riga sbagliata, ad es.

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

Questo è stato utile per catturare una stringa vuota in un file csv. –

7

Questo errore è abbastanza verbose:

ValueError: could not convert string to float: id 

Da qualche parte nel file di testo, una linea ha la parola id in esso, che non può davvero essere convertito in un numero.

Il codice di test funziona perché la parola id non è presente in line 2.


Se si vuole prendere quella linea, provare questo codice. Ho pulito il codice su un tantino:

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

I suoi dati non può essere quello che ci si aspetta - a quanto pare ti aspetti, ma non sempre, galleggia.

Una soluzione semplice per capire dove ciò si verifica potrebbe essere quella di aggiungere un try/tranne che per il 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

Il mio errore è stato molto semplice: il file di testo che contiene i dati aveva qualche spazio (quindi non visibile) carattere sull'ultima riga.
Come output di grep, avevo 45  anziché solo 45.

La classica cosa stupida che ti fa perdere ore. :-)

+1

Spazi e schede sono visibili;) Fine riga e simili non sono, ad esempio, caratteri '\ n',' \ r'. –

0

Forse i tuoi numeri non sono in realtà numeri, ma lettere mascherate da numeri?

Nel mio caso, il carattere che stavo usando significava che "l" e "1" sembravano molto simili. Avevo una stringa come "l1919" che pensavo fosse "11919" e che incasinò le cose.

Problemi correlati