2011-12-07 16 views
30

मैं निम्नलिखित अजगर स्क्रिप्ट चल रहा हूँ:ValueError: फ्लोट करने के लिए स्ट्रिंग परिवर्तित नहीं कर सकता है: आईडी

ValueError: could not convert string to 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] 

हालांकि मैं की तरह त्रुटियों मिला है। जब मैं इंटरैक्टिव खंड में केवल एक लाइन के लिए यह कोशिश, स्क्रिप्ट का उपयोग कर पाश के लिए के बजाय:

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

जाहिर है अपने लाइनों की कुछ वैध नाव डेटा नहीं है, विशेष रूप से कुछ लाइन पाठ 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

यह एक सीएसवी फ़ाइल में एक खाली स्ट्रिंग को पकड़ने में सहायक था। –

7

यह त्रुटि सुंदर वर्बोज़ है:

ValueError: could not convert string to float: id 

कहीं अपनी पाठ फ़ाइल में एक पंक्ति में शब्द id, जो वास्तव में एक नंबर में परिवर्तित नहीं किया जा सकता है।

आपका टेस्ट कोड काम करता है क्योंकि id शब्द line 2 में मौजूद नहीं है।


यदि आप उस रेखा को पकड़ना चाहते हैं, तो इस कोड को आजमाएं।

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

आपका डेटा नहीं हो सकता है कि आप क्या उम्मीद - यह आप उम्मीद कर रहे हैं, लेकिन नहीं मिल रहा है लगता है, तैरता है।

पता लगाना करने के लिए एक सरल समाधान जहां ऐसा होता होगा एक कोशिश को जोड़ने के लिए/करने के लिए लूप को छोड़कर:

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

शायद आपकी संख्या वास्तव में संख्या नहीं है, लेकिन अक्षरों संख्याओं के रूप में मजाक कर रहे हैं?

मेरे मामले में, जिस फ़ॉन्ट का मैं उपयोग कर रहा था, उसका मतलब था कि "एल" और "1" बहुत समान दिखते थे। मेरे पास 'l1919' जैसी स्ट्रिंग थी जिसे मैंने सोचा था कि '119 9' और वह गड़बड़ चीजें थीं।

संबंधित मुद्दे