2012-04-16 2 views
5

ho qualche codice Python che tira le stringhe di un file di testo: codicePython errore: non potevano convertire la stringa di galleggiare

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

Python:

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

Questo dà un errore:

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

Perché non è possibile convertire [2.974717463860223e-06 in un float?

+7

vede il vostro messaggio di errore nel '['? –

risposta

16

Hai ancora il [ davanti al tuo "float" che impedisce l'analisi.

Perché non utilizzare un modulo adeguato per questo? Per esempio:

>>> 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' è la strada da percorrere. –

+0

Perché non solo b = eval (a)? – Akavall

+6

@Akavall 'eval' non è sicuro perché valuterà il codice arbitrario. 'literal_eval' valuterà solo determinati codici della struttura dati, come liste, dict, bool e' None'. –

3

si sta catturando la prima parentesi, modificare string.index("[") a string.index("[") + 1

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

index() indice di ritorno del dato carattere, in modo che '[' è incluso in sequenza restituita da [:].

5

Si può effettuare le seguenti operazioni per convertire la stringa di leggere dal file a un elenco di galleggiante

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

Il motivo per il codice è in caso contrario, non si sta estraendo il '[' dalla stringa.

+3

Se 'json.loads' o' ast.literal_eval' non esistessero, questo sarebbe il modo migliore per eseguire l'operazione. –

1

Questo vi darà una lista di carri allegorici, senza la necessità di importazioni in più ecc

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]