È possibile utilizzare la eval
built-in. Ad esempio, questo dovrebbe funzionare se ogni voce del dizionario è su una linea diversa:
dicts_from_file = []
with open('myfile.txt','r') as inf:
for line in inf:
dicts_from_file.append(eval(line))
# dicts_from_file now contains the dictionaries created from the text file
In alternativa, se il file è solo un grande dizionario (anche su più righe), si può fare questo:
with open('myfile.txt','r') as inf:
dict_from_file = eval(inf.read())
Questo è probabilmente il modo più semplice per farlo, ma non è il più sicuro. Come altri hanno menzionato nelle loro risposte, eval
ha alcuni rischi intrinseci per la sicurezza. L'alternativa, come menzionato da JBernardo, è quella di usare ast.literal_eval
che è molto più sicuro di eval dato che valuterà solo le stringhe che contengono letterali. È possibile semplicemente sostituire tutte le chiamate a eval
negli esempi precedenti con ast.literal_eval
dopo l'importazione del modulo ast
.
Se si utilizza Python 2.4 non si avrà il modulo ast
e non si avranno le istruzioni with
. Il codice sarà più simile a questo:
inf = open('myfile.txt','r')
dict_from_file = eval(inf.read())
inf.close()
Non dimenticare di chiamare inf.close()
. La bellezza delle affermazioni with
è che lo fanno per te, anche se il blocco di codice nella dichiarazione with
solleva un'eccezione.
fonte
2012-02-16 16:19:26
'ast.literal_eval' – JBernardo
@JBernardo +1 come a patto che tu abbia Python 2.6 o più recente, questa è la strada da percorrere. Il modulo 'ast' è stato introdotto in 2.5, ma non aveva le funzioni di supporto (come' literal_eval'). Quelli sono arrivati in 2.6. –
@JBernardo, risposta migliore – dzhioev