2011-12-07 30 views
30

Tôi đang chạy các script python sau:ValueError: không thể chuyển đổi chuỗi nổi: 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] 

Tuy nhiên tôi nhận được các lỗi như:

ValueError: could not convert string to float: id 

Tôi đang bối rối bởi điều này. Khi tôi cố gắng này chỉ một dòng trong phần tương tác, thay vì cho vòng lặp sử dụng kịch bản:

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

tôi hoạt động tốt.

Có ai có thể giải thích một chút về điều này không? thx

Trả lời

27

Rõ ràng một số dòng của bạn không có dữ liệu phao có giá trị, đặc biệt là một số dòng có văn bản id mà không thể được chuyển đổi sang nổi.

Khi bạn dùng thử trong lời nhắc tương tác, bạn chỉ đang thử dòng đầu tiên, vì vậy cách tốt nhất là in dòng mà bạn gặp phải lỗi này và bạn sẽ biết sai dòng, ví dụ:

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

Điều này hữu ích khi bắt chuỗi rỗng trong tệp csv. –

7

Lỗi này là khá dài dòng:

ValueError: could not convert string to float: id 

Somewhere trong tập tin văn bản của bạn, một dòng có chữ id trong đó, có thể không thực sự được chuyển đổi sang một số.

Mã thử nghiệm của bạn hoạt động vì từ id không có trong line 2.


Nếu bạn muốn bắt dòng đó, hãy thử mã này. Tôi làm sạch mã của bạn lên một chút:

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

Dữ liệu của bạn có thể không phải là những gì bạn mong đợi - có vẻ như bạn đang mong đợi, nhưng không nhận được, nổi.

Một giải pháp đơn giản để tìm ra nơi này xảy ra sẽ có thêm một thử/trừ để cho vòng lặp:

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

lỗi của tôi rất đơn giản: các tập tin văn bản có chứa các dữ liệu đã có một số không gian (để không hiển thị) ký tự trên dòng cuối cùng.
Là đầu ra của grep, tôi có 45  thay vì chỉ 45.

Điều ngu ngốc kinh điển khiến bạn mất nhiều thời gian. :-)

+1

Dấu cách và các tab hiển thị;) Kết thúc các dòng và số không giống nhau, ví dụ: ký tự '\ n',' \ r'. –

0

Có lẽ số của bạn không thực sự là số, nhưng các chữ cái giả mạo là số?

Trong trường hợp của tôi, phông chữ tôi đang sử dụng có nghĩa là "l" và "1" trông rất giống nhau. Tôi đã có một chuỗi như 'l1919' mà tôi nghĩ là '11919' và những thứ lộn xộn đó.

Các vấn đề liên quan