2011-11-02 29 views
5

olarak) (şamandıra için geçersiz literal:ValueError: Tümüne Python

Birisi bana hatasını anlamasına yardımcı olabilir eğer merak var: ValueError: şamandıra için geçersiz değişmez(). Bir listeye bir metin dosyası aktardığımda bu listeyi float değerlerine dönüştürmeye çalışırken bunu alıyorum.

print repr(lines[0]) 

alıyorum:

'0,000 \ t0.000 ... \ t0.000 \ t0 en azından bana, garip Ne

a = open("input.txt","r") 
lines = a.readlines() 
b = map(float, lines) 

Ben işlemden geçirirken olmasıdır 0,000 \ n'

ve

print type(lines[0]) 

alıyorum:

<type 'str'> 

Bu yüzden neden haritanın (şamandıra, çizgiler) düzgün çalışmadığını anlamıyorum. Bu işlevi yanlış mı kullanıyorum? Belgelere bakıldığında harita işlevi şu şekilde verilir: harita (işlev, yinelenebilir, ...). Bir liste tekrarlanamaz mı? Birisi bu hatayı açıklayabilir eğer

Ayrıca/I çok iyi olur bu hata için bir açıklama yönde bana gelin.

Bu soruyla ilgili yardım için şimdiden teşekkür ederiz.

+1

sen söylüyorsun '0,000 \ t0.000 ... \ t0 o .000 \ n' bir satır mı? Öyleyse, o zaman float() 'a aktarıldığını varsayalım ve dönüşemez. Bireysel float değerlerine ayırmanız gerekiyor gibi görünüyor. Bu dava mı? – eldarerathis

+0

@eldarerathis Evet hepsi bir çizgidir, ama sonra değerler belirli sayıda boyunca bunu yapmak için görünür bana hata veriyor işlemden geçirirken b = haritayı (float, çizgiler) ValueError: şamandıra() için geçersiz literal: 0,000 0,000 \t 0,000 \t 0,000 \t 0,000 \t 0,000 0,000 \t 0,000 \t 0,000 \t 0,000 \t 0,000 \t.000 \t 0,000 \t 0,000 \t 0,000 \t 0,000 \t 0,000 \t 0,000 \t 0,000 \t 0,000 \t 0,000 \t 0,000 \t 0,000 \t 0,000 \t \t 0,000 \t 0,000 \t 0,000 \t 0,000 \t 0,000 \t 0,000 \t 0. mi 0.000 \t 0.000 \t 0.000 değil aslında değerleri aracılığıyla yapmak? – geop

+0

Bu, yalnızca yukarıda belirttiğiniz bir dizgeye benziyor, ancak '\ t' beyaz boşluk olarak (yani gerçek bir sekme karakteri) görüntülenir. Hepsi tek bir dizgi, bir grup kısa değil, tahmin ediyorum. – eldarerathis

cevap

7

Bu durumda okuma satırlarına ihtiyacınız yoktur - bu, zaman ve bellek kaybıdır.

Eğer yüzen listelerin bir listesini istiyorsanız: şamandıraların

b = [[float(v) for v in line.rstrip('\n').split('\t')] for line in a] 

veya sadece büyük bir liste:

b = [float(v) for line in a for v in line.rstrip('\n').split('\t')] 
2

a.readlines() dizelerin bir listesidir, bu nedenle haritanızda float('0.000\t0.000\t0.000\t0.000\n') dönüştürmeye çalışıyorsunuz, bu da gördüğünüz hatayı açıklıyor. ValueError dizesinde \t karakteri geliyor

>>> x = '0.000\t0.000\t0.000\t0.000\n' 
# To simulate a.readlines()' list 
>>> lines = [x,] 
>>> 

# Strip the newline, and separate the values based on the tab control character. 
>>> lines_values = map(lambda l: l.strip().split('\t'), lines) 
>>> lines_values 
[['0.000', '0.000', '0.000', '0.000']] 

# For each value in in the list of lines' values, convert from string to a float. 
>>> values_float = [map(float, v) for v in values] 
>>> values_float 
[[0.0, 0.0, 0.0, 0.0]] 
+0

Yardım için çok teşekkür ederim. Bu, yanlış yaptığımı çok net gösteriyor. Yorumları gerçekten takdir ediyorum! – geop

2

:

Sen (inline yorumlara bakınız) biraz daha işlem yapmak gerekir. Her bir satırı tek tek dönüştürmeden önce her satırı tek tek sütunlara ayırmalısınız.

>>> lines = ['0.000\t1.000\t2.000\n', '3.000\t4\t5.0\n'] 
>>> [[float(val) for val in line.strip().split('\t')] for line in lines] 
[[0.0, 1.0, 2.0], [3.0, 4.0, 5.0]] 
+0

Yardımın için teşekkürler, bu hatamı anlamama yardımcı oluyor. Anlamadığım şey, bir hata fark edilmeden önce sürecin bir kısmının işlemden geçirilmiş gibi nasıl göründüğü? Bu benim üzerimde bir yanlış anlama mı? – geop

+0

Yukarıda yanıtlandı .... – geop