2011-03-10 20 views
7

Programım, bir dizeyi bir dizelerden kayan nokta sayısına dönüştürmeye çalıştığında bana bir hata veriyor. Liste bir CSV metin dosyasındaki bir satırdan okunur ve daha sonra bir listeye ayrılır. Bu işi nasıl yaparım ve neden yanlış gidiyor?Neden float() dizgemi bir float'a dönüştüremiyor?

def Main(): 
    srcf = open(bkp, 'r') 
    for line in srcf: 
     liLn = line.split(',') 

... Sonra aşağıdaki fonksiyon denir ... İşte

def Pred_PSME(liLn): 
    dbh = float(liLn[6]) 

dosyadan çizgidir:

1345327,20486,"ABCO","Abies concolor","Y","Y","31.496","0.0779","19.3567",,"0.5602","0",1,"0.9268","11.8968","2.6832","6.6646","2399.256",54.47,24.15,248.47,42.19,9.16,8.16,9.23,272.27,264.11,369.30,345.15,71.80,0.00,0.00,4393.57,4106.22,3239.25,3142.07,854.30,0.00,0.00,,12.70,10.16,15.24,0.02,0.04,0.38,0.38,0.00,0.00,1.95,1.83,1.44,1.40

İşte kodun ilgili parçalarıdır

Bu hata iletisini alıyorum:

Traceback (most recent call last): 
    File "/home/cfws/python/error_calcs/FC_NF_PredInt_Gen8.py", line 263, in <module> 
    Main() 
    File "/home/cfws/python/error_calcs/FC_NF_PredInt_Gen8.py", line 36, in Main 
    li_tBQI = BQI_Calc(liLn) 
    File "/home/cfws/python/error_calcs/FC_NF_PredInt_Gen8.py", line 63, in BQI_Calc 
    di_eqns = {"PSME": Pred_PSME(liLn), "ABAM":Pred_ABAM(liLn), \ 
    File "/home/cfws/python/error_calcs/FC_NF_PredInt_Gen8.py", line 172, in Pred_PSME 
    dbh = float(liLn[6]) 
ValueError: could not convert string to float: "31.496" 

Ubuntu Linux bilgisayarında Python 2.7 kullanıyorum.

+1

liLn [6] '' 31.496 '' içeren, tırnak işaretleri de dahil olmak üzere, 'float() '' a geçmeden önce bunları kesmelisiniz; Bu sadece bir tahmin. Ayrıca, ilk söyleyeyim, SO'ya hoş geldiniz! :) –

+5

Neden csv' kullanmıyorsunuz? –

+0

"csv" modülünü kullanıp kullanmadığınıza bakılmaksızın, tüm bu değerleri daha kolay ve okunabilir hale getirmek için bir kap sınıfına ("koleksiyonlar modülündeki" namedtuple "tuple alt sınıfı gibi) eklemeyi düşünmelisiniz. Örneğin liLn.dbh'. Başka bir şey yoksa, adının alan dizinini içeren tamsayı değişkenlerini tanımlayabilirsiniz. Örneğin, 'DBH = 2' ayarı' liLn [6] 'yerine liLn [DBH]' yazmanıza izin verir. – martineau

cevap

9

Çift tırnak işaretini dizgeden ayırmanız gerekir. Bu, float() 'ın dönüşebileceği meşru bir kayan nokta dizesi verecektir.

+5

Haha! Teşekkürler, işe yaradı. Bir defne şapkamı koyacağım ve bir köşede köşeye oturacağım. – cfwschmidt

İlgili konular