¿Cómo guardar una lista de Python en un archivo para recuperarla después?

rulflink - 14/04/2011 21:40
Muy buenas, una pregunta. He hecho un pequeño script para probar, he creado una lista vacía. Lista = []. Y luego he creado un botón que al pulsarlo me añade la posición de un cubo a la lista.

Mediante append().

La pregunta es ¿cómo puedo hacer para que al guardar el archivo y al volver a abrirlo recuerde esa lista?
Espero haberme explicado bien. Gracias.
Mars Attacks - 16/04/2011 21:52
No puedes. Tendrías que guardar esa información en algún tipo de estructura de datos en un fichero del ordenador y recuperarla posteriormente leyéndola de nuevo (y, dependiendo de lo que hagas, podría no ser una lista valida). ¿Qué quieres hacer exactamente?
rulflink - 17/04/2011 00:30
Gracias por la respuesta. Lo que quería hacer es memorizar la posición de los huesos(que los añadía en la lista) para grabar gestos en el Rig facial que estoy haciendo.
rulflink - 17/04/2011 01:16
pose library.
JEMV - 22/04/2011 22:28
Puedes almacenar el contenido de la lista en un archivo de texto, luego cuando ejecutes el código nuevamente buscas el archivo de texto mediante códigos y agregas el contenido a la lista que creaste. Pero ya sabrás que tendrás que hacer otro pequeño script que vaya dividiendo cada parte del dato que hay en el archivo de texto puesto que si agregas directamente el contenido a la lista se almacenara como un solo elemento. Suerte.
Klópes - 23/04/2011 13:44
Si quieres guardar información en un proyecto de Blender puedes crear un texto y escribir los datos en él, con el submódulo Bpy, ops, text.
Caronte - 23/04/2011 21:12
Y por que no usas la librería de posturas de Blender, que para eso está y funciona perfectamente?
rulflink - 24/04/2011 15:13
Gracias por las respuestas, estoy probando con postura library, pero todavía no me aclaro del todo. También probaré lo tuyo Klópes, aunque igual sea más útil la postura library, bueno es saber lo del texto.

Jemv, lo tuyo me parece un poco más complejo, no domino tampoco mucho el Python.
Cesar Saez - 25/04/2011 03:35

Puedes almacenar el contenido de la lista en un archivo de texto, luego cuando ejecutes el código nuevamente buscas el archivo de texto mediante códigos y agregas el contenido a la lista que creaste. Pero ya sabrás que tendrás que hacer otro pequeño script que vaya dividiendo cada parte del dato que hay en el archivo de texto puesto que si agregas directamente el contenido a la lista se almacenara como un solo elemento.

En Python cuentas con excelentes alternativas para serializar información, por ejemplo, el módulo pickle y/o cpickle (binario) para estas cosas está muy bien (si necesitas archivos legibles a ojo humano el módulo Json es más xml)
-[url]http://docs. Python.org/library/pickle.html[/url].
-[url]http://docs. Python.org/library/Json.html[/url].

Y en cualquier caso, si salvas la lista como un string la puedes recuperar con un simple eval().

I <3 Python.
rulflink - 25/04/2011 19:21
Gracias César Sáez, he estado probando y funciona. Pero cual es la teoría? Donde se almacena? Es magia? También he probado lo de postura library, pero si esto lo puedo utilizar creo que será más cómodo.

Por si a alguien le interesa (blender 2.57):
Import pickle.

Data = [(0,1,2), (3,4,5), (6,7,1)].

F = open (data, pickle,wb) #creamos el archivo que albergara la lista, con wb le decimos que el archivo está en modo writable (escribible).

Pickle, dump(data, pickle. Highest_protocol) #con esto añadimos la lista data al archivo data, pickle.

Si queremos añadir valores a la lista.

Data, append((3,6,7)).

Pickle, dump(data, pickle. Highest_protocol) # como data ha cambiado volvemos a decirle que añada data al archivo.

F, close () #cerramos el archivo data, pickle.

Para retomarlo o leerlo:
F = open(data, pickle,RB) #llamamos al archivo, pero en modo lectura RB.

Data = pickle, load(f).
>>> data.
[(0,1,2), (3,4,5), (6,7,1), (3,6,7)].
Klópes - 25/04/2011 22:51
Rulflink, el módulo pickle se encarga de guardar los datos de forma ordenada y estructurada, incluyendo los tipos y longitudes. De esa manera no necesites controlar que estas escribiendo y leyendo directamente. Es la forma rápida y eficiente de manejar ficheros en Python.
rulflink - 28/04/2011 17:59
Buenas, he investigado sobre las dos vertientes (pose library y modulo pickle), y en las dos me he quedado atascado. A ver si alguien me puede ayudar.
pose library: mi intención es cambiar las posturas mediante sliders, lo único que se me ha ocurrido es añadirle constraints action a los huesos con target en un Empty en location x.

Entonces sería la posición del Empty lo que movería el slider para colocar una pose, no hay ningún problema hasta que intento mover un hueso, que se vuelve loco.
¿Cómo podría añdirle un driver a una postura de postura library sin pasar por colocar acciones?
modulo pickle: ya se crear el archivo donde se añadirán los datos, incluso puedo hacer la carpeta real(f = open(/tmp/nombre, txt,wb)), pero así solo funcionaria en mí propio ordenador.

No sé cómo puedo fijar el archivo dentro de mi archivo blend, (como empaquetar texturas), para que si yo cambiara el archivo de ordenador pudiera seguir trabajando, para así ser más cómodo.

Y no tener que acordarse de guardar el archivo.

Espero haberme explicado bien. Gracias.
Cesar Saez - 29/04/2011 00:49
Yo ni idea de Blender, pero siempre puedes salvar/cargar el serializado de pickle a un string y guardarlo en un atributo de la escena (¿se pueden crear Custom Attributes en Blender?)
El código es prácticamente igual, pickle, dumps() y picle, loads().

De todas formas, me extrañaría mucho que teniendo una herramienta para salvar/cargar posturas tengas que re-programarla por ti mismo, seguro que mirando la documentación puedes llegar a algo que te funcione con las herramientas de serie, no lo descartes de entrada sólo porque Python mola mucho.