2011-11-02 15 views
5

A todos:ValueError: inválido literal de flotador() en Python

Tengo curiosidad por si alguien puede ayudarme a entender el error: ValueError: inválido literal de flotador(). Estoy obteniendo esto cuando estoy pasando un archivo de texto a una lista y luego trato de convertir esta lista en valores flotantes.

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

Lo que es extraño, al menos para mí es que cuando proceso:

print repr(lines[0]) 

me sale:

'0.000 \ t0.000 ... \ t0.000 \ t0 0,000 \ n'

y

print type(lines[0]) 

me sale:

<type 'str'> 

No entiendo, por tanto, por qué el mapa (flotante, líneas) no funciona correctamente. ¿Estoy usando esta función incorrectamente? Mirando la documentación, la función del mapa se da como: mapa (función, iterable, ...). ¿Una lista no es iterable?

Además, si alguien pudiera explicar este error/señalarme en la dirección de una explicación de este error, lo agradecería mucho.

Gracias de antemano por su ayuda con esta pregunta.

+1

¿Estás diciendo que '0,000 \ t0.000 ... \ t0 .000 \ n' es todo una línea? Si es así, supongo que eso es lo que se está pasando en 'float()' y no se puede convertir. Parece que necesitarías dividirlo en valores flotantes individuales. Es ese el caso? – eldarerathis

+0

@eldarerathis Sí, es una sola línea, pero cuando la proceso parece pasar por un cierto número de valores, entonces me da el error: b = map (float, lines) ValueError: literal no válido para float(): 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 \t 0.000 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 \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 \t 0.000 0.000 0.000 \t \t 0. Es no es en realidad haciéndolo a través de los valores? – geop

+0

Parece la única cadena que anotó anteriormente, pero con el '\ t' se muestra como un espacio en blanco (es decir, un carácter de tabulación real). Eso es todo una cadena literal, no un montón de más cortas, supongo. – eldarerathis

Respuesta

7

No necesita líneas de lectura en este caso, es una pérdida de tiempo y de memoria.

Si desea una lista de listas de flotadores:

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

o simplemente una lista grande de los flotadores:

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

a.readlines() es una lista de cadenas, por lo que intenta convertir float('0.000\t0.000\t0.000\t0.000\n') a su mapa, lo que explica el error que está viendo.

que tiene que hacer un poco más procesamiento (ver los comentarios en línea):

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

Muchas gracias por la ayuda. Esto hace que lo que estaba haciendo incorrectamente sea muy claro. ¡Realmente aprecio los comentarios! – geop

2

El ValueError viene del carácter \t en la cadena. Debe dividir cada línea en las columnas individuales antes de convertirlas individualmente.

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

Gracias por la ayuda, esto me ayuda a entender mi error. Lo que no entiendo es cómo parecía que parte de la fecha se pasó por el proceso antes de que se notara un error. ¿Es esto un malentendido de mi parte? – geop

+0

Respondido anteriormente .... – geop