2011-11-02 12 views
5

Wszystkim:ValueError: nieprawidłowy dosłowny dla pływaka() w Pythonie

mam ciekawy, czy ktoś może mi pomóc zrozumieć ten błąd: ValueError: nieprawidłowy dosłowny dla pływaka(). Otrzymuję to, gdy przekazuję plik tekstowy do listy, a następnie próbuję przekonwertować tę listę na wartości zmiennoprzecinkowe.

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

Co jest dziwne, przynajmniej dla mnie jest to, że kiedy proces:

print repr(lines[0]) 

uzyskać:

„0.000 \ t0.000 ... \ t0.000 \ t0 0,000 \ n”

i

print type(lines[0]) 

uzyskać:

<type 'str'> 

Nie rozumiem, dlaczego mapa (pływak, linie) nie działa poprawnie. Czy używam tej funkcji nieprawidłowo? Patrząc na dokumentację funkcja mapy jest podana jako: map (funkcja, iterowalna, ...). Czy lista nie jest do sprawdzenia?

Również, jeśli ktoś mógłby wyjaśnić ten błąd/wskazać mi kierunek wytłumaczenia tego błędu, byłbym bardzo wdzięczny.

Z góry dziękujemy za pomoc w odpowiedzi na to pytanie.

+1

mówisz, że '0.000 \ t0.000 ... \ t0 .000 \ n' to wszystko jedna linia? Jeśli tak, to zakładam, że to jest przekazywane do 'float()' i nie można go przekonwertować. Wygląda na to, że musisz podzielić go na poszczególne wartości zmiennoprzecinkowe. Czy tak jest? – eldarerathis

+0

@eldarerathis Tak, to wszystko jest jedną linią, ale kiedy ją przetworzę, wydaje się, że przechodzi przez pewną liczbę wartości, to daje mi błąd: b = map (float, lines) ValueError: invalid literal for float(): 0.000 \t 0,000 \t \t 0.000 0.000 0.000 \t \t \t 0.000 0.000 0.000 \t \t \t 0.000 0.000 0.000 \t \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 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. Czy nie jest właściwie przechodząc przez wartości? – geop

+0

Wygląda to tylko na jeden napis, który zanotowałeś powyżej, ale z tym, że '\ t 'jest wyświetlane jako biała spacja (to jest rzeczywisty znak tabulatora). To wszystko jeden literał smyczkowy, a nie garść krótszych, zgaduję. – eldarerathis

Odpowiedz

7

Nie potrzebujesz w tym przypadku linii do czytania - to strata czasu i pamięci.

Jeśli chcesz wykaz wykazów pływaków:

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

lub po prostu jeden wielki listę pływaków:

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

to lista ciągów znaków, dlatego próbujesz przekonwertować na swoją mapę float('0.000\t0.000\t0.000\t0.000\n'), co wyjaśnia błąd, który widzisz.

Trzeba zrobić nieco więcej przetwarzania (patrz komentarze inline):

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

Dziękuję bardzo za pomoc. To sprawia, że ​​to, co robiłem, jest niepoprawne. Naprawdę doceniam komentarze! – geop

2

ValueError pochodzi z \t znaku w ciągu. Musisz podzielić każdą linię na poszczególne kolumny, zanim dokonasz konwersji każdego z nich osobno.

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

Dzięki za pomoc, pomóż mi zrozumieć mój błąd. Czego nie rozumiem, to jak wyglądało, jakby część daty została przekazana do procesu, zanim zauważono błąd? Czy to nieporozumienie z mojej strony? – geop

+0

Odpowiedziałeś powyżej ... – geop

Powiązane problemy