2011-01-28 19 views
7

Tengo un archivo de texto que me gustaría leer que contiene filas de tuplas. Cada tupla/fila en el texto tiene la forma de ('cadena de descripción', [lista de enteros 1], [lista de enteros 2]). Donde el archivo de texto podría ser algo así como:Lea en una tupla de listas del archivo de texto como tupla, no cadena - Python

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

Me gustaría poder leer cada línea desde el archivo de texto, luego colocarlos directamente en una función donde,

function(string, list1, list2) 

Sé que cada línea se lee como una cadena, pero necesito extraer esta cadena de alguna forma. He estado tratando de usar un string.split (','), pero eso entra en problemas cuando llego a las listas. ¿Hay alguna manera de lograr esto o tendré que modificar mis archivos de texto de alguna manera?

que también tienen un archivo de texto de una lista de tuplas que me gustaría leer en forma similar que se encuentra en la forma de

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

que pueden contener cualquier cantidad de tuplas. Me gustaría leerlo en una lista y hacer un bucle for para cada tupla de la lista. Me imagino que estos dos usarán aproximadamente el mismo proceso.

Respuesta

12

¿Qué hay de usar eval?

EDIT Consulte la respuesta de @ Ignacio utilizando 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]) 

Solo recomendaría hacer esto si está 100% seguro del contenido del archivo.

>>> 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] 

Ver la respuesta de @ Ignacio ... mucho, mucho más seguro.

Aplicando el uso de ast cedería:

>>> 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

Usted está buscando 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 en una hora, cuando puedo votar de nuevo :) – sberry

+0

Probablemente debería haber mencionado que estoy ejecutando Python 2.3, ¿es esto para una versión posterior? No puedo encontrar el módulo ast. –

+0

@ Das.Rot: Lamentablemente sí lo es. –

1

Es posible que desee ver también en el módulo pickle para guardar objetos de Python a cabo en archivos de texto y luego leerlos de nuevo.