2012-04-16 688 views
5

Tengo algo de código Python que mueve los hilos de un archivo de texto: Códigoerror de Python: No se pudo convertir la cadena a flote

[2.467188005806714e-05, 0.18664554919828535, 0.5026880460053854, ....] 

Python:

v = string[string.index('['):].split(',') 
for elem in v: 
    new_list.append(float(elem)) 

Esto da un error:

ValueError: could not convert string to float: [2.974717463860223e-06 

Por qué no [2.974717463860223e-06 se puede convertir en un flotador?

+7

Cómo ves el mensaje de error en su '['? –

Respuesta

16

todavía tienes la [ en frente de su "flotante" que impide el análisis sintáctico.

por qué no utilizar un módulo adecuado para eso? Por ejemplo:

>>> a = "[2.467188005806714e-05, 0.18664554919828535, 0.5026880460053854]" 
>>> import json 
>>> b = json.loads(a) 
>>> b 
[2.467188005806714e-05, 0.18664554919828535, 0.5026880460053854] 

o

>>> import ast 
>>> b = ast.literal_eval(a) 
>>> b 
[2.467188005806714e-05, 0.18664554919828535, 0.5026880460053854] 
+4

+1: 'literal_eval' es el camino a seguir. –

+0

¿Por qué no solo b = eval (a)? – Akavall

+6

@Akavall 'eval' no es seguro porque evaluará el código arbitrario. 'literal_eval' solo evaluará ciertos códigos de estructura de datos, como listas, dicts, bools y' None'. –

3

está capturando el primer soporte, cambie string.index("[") a string.index("[") + 1

0
v = string[string.index('[') + 1:].split(',') 

index() índice de retorno de carácter determinado, de manera que '[' se incluye en la secuencia devuelta por [:].

5

Usted puede hacer lo siguiente para convertir su cadena que se lee desde el archivo a una lista de flotación

>>> instr="[2.467188005806714e-05, 0.18664554919828535, 0.5026880460053854]" 
>>> [float(e) for e in instr.strip("[] \n").split(",")] 
[2.467188005806714e-05, 0.18664554919828535, 0.5026880460053854] 

La razón por la que su código es fallar es que no estás quitando el '[' de la cuerda.

+3

'' json.loads' o ast.literal_eval' no existía, esta sería la mejor manera de realizar la tarea. –

1

Esto le dará una lista de los flotadores sin necesidad de importaciones extra, etc.

s = '[2.467188005806714e-05, 0.18664554919828535, 0.5026880460053854]' 
s = s[1:-1] 
float_list = [float(n) for n in s.split(',')] 


[2.467188005806714e-05, 0.18664554919828535, 0.5026880460053854] 
Cuestiones relacionadas