105 votes

ValueError : n'a pas pu convertir la chaîne en flottant : id

J'exécute le script python suivant :

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

Cependant, j'ai les erreurs comme:

 ValueError: could not convert string to float: id

Je suis confus par cela. Lorsque j'essaie ceci pour une seule ligne dans la section interactive, au lieu d'une boucle for utilisant un 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...]

Ça marche bien.

Quelqu'un peut-il expliquer un peu à ce sujet? Merci.

67voto

Anurag Uniyal Points 31931

De toute évidence, certaines de vos lignes n'ont pas de données flottantes valides, en particulier certaines lignes ont du texte id qui ne peut pas être converti en flottant.

Lorsque vous l'essayez dans l'invite interactive, vous n'essayez que la première ligne, donc le meilleur moyen est d'imprimer la ligne où vous obtenez cette erreur et vous saurez la mauvaise ligne, par exemple

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

35voto

Mon erreur était très simple : le fichier texte contenant les données avait du caractère espace (donc non visible) sur la dernière ligne.

En sortie de grep, j'avais 45  au lieu de seulement 45 .

23voto

Blender Points 114729

Cette erreur est assez verbeuse :

 ValueError: could not convert string to float: id

Quelque part dans votre fichier texte, une ligne contient le mot id , qui ne peut pas vraiment être converti en nombre.

Votre code de test fonctionne car le mot id n'est pas présent dans line 2 .


Si vous voulez attraper cette ligne, essayez ce code. J'ai nettoyé un peu ton code :

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

8voto

Tom Roth Points 495

Peut-être que vos nombres ne sont pas réellement des nombres, mais des lettres déguisées en nombres ?

Dans mon cas, la police que j'utilisais signifiait que "l" et "1" étaient très similaires. J'avais une chaîne comme « l1919 » que je pensais être « 11919 » et cela a gâché les choses.

7voto

Matt Fenwick Points 17097

Vos données peuvent ne pas correspondre à vos attentes : il semble que vous attendiez, mais que vous n'obteniez pas, des flottants.

Une solution simple pour déterminer où cela se produit serait d'ajouter un try/except à la boucle 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]

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X