147 votes

Comment sauvegarder et restaurer plusieurs variables en python ?

J'ai besoin de sauvegarder une douzaine d'objets dans un fichier et de les restaurer plus tard. J'ai essayé d'utiliser une boucle for avec pickle et shelve mais cela n'a pas fonctionné correctement.

Edit.
Tous les objets que j'essayais de sauvegarder étaient dans la même classe (j'aurais dû le mentionner avant), et je n'avais pas réalisé que je pouvais simplement sauvegarder toute la classe comme ça :

import pickle
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'

1 votes

Vous dites que vous avez essayé une boucle for. Veuillez afficher ce code, et expliquer pourquoi "cela n'a pas fonctionné correctement" (c'est-à-dire ce qui s'est passé et ce que vous vouliez qu'il se passe).

0 votes

Si vous êtes sous Windows, assurez-vous d'ouvrir les fichiers en mode binaire.

0 votes

@gnibbler : le mode binaire n'est nécessaire que pour les protocoles hors défaut ( docs.python.org/library/pickle.html#usage ).

5voto

Mike McKerns Points 965

Vous pourriez utiliser klepto qui fournit une mise en cache persistante en mémoire, sur disque ou dans une base de données.

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

Ensuite, après le redémarrage de l'interprète...

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': <function add at 0x10610a0c8>, 'f': <__main__.Foo object at 0x10510ced0>, 'max': <built-in function max>, 'Foo': <class '__main__.Foo'>, 'squared': <function <lambda> at 0x10610a1b8>}, cached=True)
>>> db['add'](2,3)
5
>>> db['squared'](3)
9
>>> db['f'].bar(4)
5
>>> 

Obtenez le code ici : https://github.com/uqfoundation

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X