¿Cómo guardo y restauro múltiples variables en python?

Necesito guardar una docena de objetos en un archivo y luego restaurarlos más tarde. He intentado usar un bucle for con pickle y shelve pero no funcionó bien.

Editar.
Todos los objetos que intentaba guardar estaban en la misma clase (debería haber mencionado esto antes), y no me di cuenta de que podía salvar a toda la clase de esta manera:

def saveLoad(opt): global calc if opt == "save": f = file(filename, 'wb') pickle.dump(calc, f, 2) f.close print 'data saved' elif opt == "load": f = file(filename, 'rb') calc = pickle.load(f) else: print 'Invalid saveLoad option' 

Si necesita guardar varios objetos, simplemente puede ponerlos en una sola lista o tupla, por ejemplo:

 import pickle # obj0, obj1, obj2 are created here... # Saving the objects: with open('objs.pkl', 'w') as f: # Python 3: open(..., 'wb') pickle.dump([obj0, obj1, obj2], f) # Getting back the objects: with open('objs.pkl') as f: # Python 3: open(..., 'rb') obj0, obj1, obj2 = pickle.load(f) 

Si tiene muchos datos, puede reducir el tamaño del archivo pasando el protocol=-1 a dump() ; pickle utilizará el mejor protocolo disponible en lugar del protocolo histórico predeterminado (y más compatible con versiones anteriores). En este caso, el archivo debe abrirse en modo binario ( wb y rb , respectivamente).

El modo binario también debe usarse con Python 3, ya que su protocolo predeterminado produce datos binarios (es decir, sin texto) (modo de escritura 'wb' y modo de lectura 'rb' ).

Hay una biblioteca incorporada llamada pickle . Usando pickle puedes volcar objetos a un archivo y cargarlos más tarde.

 import pickle f = open('store.pckl', 'wb') pickle.dump(obj, f) f.close() f = open('store.pckl', 'rb') obj = pickle.load(f) f.close() 

Debes mirar los módulos de estanterías y encurtidos . Si necesita almacenar una gran cantidad de datos, puede ser mejor usar una base de datos

Podría usar klepto , que proporciona almacenamiento en caché persistente en la memoria, el disco o la base de datos.

 dude@hilbert>$ python Python 2.7.6 (default, Nov 12 2013, 13:26:39) [GCC 4.2.1 Compatible Apple Clang 4.1 ((tags/Apple/clang-421.11.66))] on darwin Type "help", "copyright", "credits" or "license" for more information. >>> from klepto.archives import file_archive >>> db = file_archive('foo.txt') >>> db['1'] = 1 >>> db['max'] = max >>> squared = lambda x: x**2 >>> db['squared'] = squared >>> def add(x,y): ... return x+y ... >>> db['add'] = add >>> class Foo(object): ... y = 1 ... def bar(self, x): ... return self.y + x ... >>> db['Foo'] = Foo >>> f = Foo() >>> db['f'] = f >>> db.dump() >>> 

Luego, después de reiniciar el intérprete …

 dude@hilbert>$ python Python 2.7.6 (default, Nov 12 2013, 13:26:39) [GCC 4.2.1 Compatible Apple Clang 4.1 ((tags/Apple/clang-421.11.66))] on darwin Type "help", "copyright", "credits" or "license" for more information. >>> from klepto.archives import file_archive >>> db = file_archive('foo.txt') >>> db file_archive('foo.txt', {}, cached=True) >>> db.load() >>> db file_archive('foo.txt', {'1': 1, 'add': , 'f': <__main__.Foo object at 0x10510ced0>, 'max': , 'Foo': , 'squared':  at 0x10610a1b8>}, cached=True) >>> db['add'](2,3) 5 >>> db['squared'](3) 9 >>> db['f'].bar(4) 5 >>> 

Obtenga el código aquí: https://github.com/uqfoundation

El siguiente enfoque parece simple y se puede utilizar con variables de diferentes tamaños:

 import hickle as hkl # write variables to filename [a,b,c can be of any size] hkl.dump([a,b,c], filename) # load variables from filename a,b,c = hkl.load(filename)