2013-07-22 12 views
13

Ho una macchina virtuale che legge le istruzioni da tuple annidate all'interno di una lista in questo modo:Convertire una lista in una stringa e indietro

[(0,4738),(0,36), 
(0,6376),(0,0)] 

Per conservare questo tipo di programma codice macchina, un file di testo è più facile, e deve essere scritto come una stringa. Che è ovviamente abbastanza difficile da riconvertire.

Esiste un modulo in grado di leggere una stringa in un elenco/memorizzare l'elenco in modo leggibile?

requisiti:

  • deve essere leggibile in forma memorizzata (da qui "salamoia" non è adatto)
  • deve essere relativamente facile attuazione

risposta

11

JSON!

import json 

with open(data_file, 'wb') as dump: 
    dump.write(json.dumps(arbitrary_data)) 

e simile:

source = open(data_file, 'rb').read() 
data = json.loads(source) 
24

Utilizza la json module:

string = json.dumps(lst) 
lst = json.loads(string) 

Demo:

>>> import json 
>>> lst = [(0,4738),(0,36), 
... (0,6376),(0,0)] 
>>> string = json.dumps(lst) 
>>> string 
'[[0, 4738], [0, 36], [0, 6376], [0, 0]]' 
>>> lst = json.loads(string) 
>>> lst 
[[0, 4738], [0, 36], [0, 6376], [0, 0]] 

Un'alternativa potrebbe essere quella di utilizzare repr() e ast.literal_eval(); solo per liste, tuple e numeri interi che si permette anche di andata e ritorno:

>>> from ast import literal_eval 
>>> string = repr(lst) 
>>> string 
'[[0, 4738], [0, 36], [0, 6376], [0, 0]]' 
>>> lst = literal_eval(string) 
>>> lst 
[[0, 4738], [0, 36], [0, 6376], [0, 0]] 

JSON ha il vantaggio aggiunto che si tratta di un formato standard, con il supporto di strumenti al di fuori di Python sostegno serializzazione, l'analisi e la validazione. La libreria è anche molto più veloce della funzione ast.literal_eval().

+1

+1 per i collegamenti alla documentazione, grazie! –

14

Basta usare ast.literal_eval

>>> from ast import literal_eval 
>>> a = literal_eval('[(1, 2)]') 
>>> a 
[(1, 2)] 

è possibile convertirlo in una stringa utilizzando repr().

>>> repr(a) 
'[(1, 2)]' 
+0

Dang dovevo rallentare! – Serial

0

Se questi sono solo due tuple, si potrebbe memorizzarli in un file CVS utilizzando il csv module. Non c'è bisogno di parentesi/parentesi.

0
with open('path/to/file', 'w') as outfile: 
    for tup in L: 
     outfile.write("%s\n" %' '.join(str(i) for i in tup)) 

with open('path/to/file) as infile: 
    L = [tuple(int(i) for i in line.strip().split()) for line in infile] 
0

Se siete appena trattare con i tipi primitivi Python, si può semplicemente utilizzare il built-in repr():

Help on built-in function repr in module __builtin__: 

repr(...) 
    repr(object) -> string 

    Return the canonical string representation of the object. 
    For most object types, eval(repr(object)) == object. 
5

eval dovrebbe farlo in modo semplice:

>>> str([(0,4738),(0,36),(0,6376),(0,0)]) 
'[(0, 4738), (0, 36), (0, 6376), (0, 0)]' 

>>> eval(str([(0,4738),(0,36),(0,6376),(0,0)])) 
[(0, 4738), (0, 36), (0, 6376), (0, 0)] 
Problemi correlati