2011-01-28 16 views
7

Ho un file di testo che vorrei leggere che contiene righe di tuple. Ogni tupla/riga nel testo ha la forma di ('descrizione stringa', [lista di interi 1], [lista di interi 2]). Dove il file di testo può avere un aspetto simile:Lettura in tuple di liste da file di testo come tupla, non stringa - Python

('articolo 1', [1,2,3,4], [4,3,2,1])
('elemento 2', [], [4,3,2,1] ('articolo 3, [1,2], [])

Vorrei poter leggere ogni riga dal file di testo, quindi posizionarli direttamente in una funzione in cui,

function(string, list1, list2) 

so che ogni riga viene letto come una stringa, ma ho bisogno di estrarre questa stringa in qualche modo. Ho cercato di usare uno string.split (','), ma questo ha dei problemi quando ho colpito le liste. C'è un modo per farlo o dovrò modificare i miei file di testo come?

Ho anche un file di testo di una lista di tuple che vorrei leggere in modo simile che è in forma di

[(1,2), (3,4), (5,6), ...]

che può contenere qualsiasi quantità di tuple. Mi piacerebbe leggerlo in una lista e fare un ciclo for per ogni tupla nella lista. Immagino che questi due utilizzeranno grosso modo lo stesso processo.

risposta

12

Che dire dell'utilizzo di eval?

MODIFICA Vedere la risposta di @ Ignacio utilizzando ast.literal_eval.

>>> c = eval("('item 1', [1,2,3,4] , [4,3,2,1])") 
>>> c 
('item 1', [1, 2, 3, 4], [4, 3, 2, 1]) 

Si consiglia di farlo solo se si è sicuri al 100% del contenuto del file.

>>> def myFunc(myString, myList1, myList2): 
...  print myString, myList1, myList2 
... 
>>> myFunc(*eval("('item 1', [1,2,3,4] , [4,3,2,1])")) 
item 1 [1, 2, 3, 4] [4, 3, 2, 1] 

Vedere la risposta di @ Ignacio ... molto, molto più sicuro.

Applicando l'uso di AST produrrebbe:

>>> import ast 
>>> def myFunc(myString, myList1, myList2): 
...  print myString, myList1, myList2 
... 
>>> myFunc(*ast.literal_eval("('item 1', [1,2,3,4] , [4,3,2,1])")) 
item 1 [1, 2, 3, 4] [4, 3, 2, 1] 
21

Siete alla ricerca di ast.literal_eval().

>>> ast.literal_eval("('item 1', [1,2,3,4] , [4,3,2,1])") 
('item 1', [1, 2, 3, 4], [4, 3, 2, 1]) 
+0

Will +1 in un'ora, quando posso votare di nuovo :) – sberry

+0

Probabilmente avrei dovuto dire che sto usando Python 2.3, è per una versione successiva? Non riesco a trovare il modulo ast. –

+0

@ Das.Rot: Purtroppo lo è. –

1

Si consiglia di guardare anche il modulo pickle per il salvataggio di pitone oggetti fuori in file di testo e quindi la lettura di nuovo in.

Problemi correlati