web-dev-qa-db-fra.com

Comment enregistrer et restaurer plusieurs variables en python?

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

Modifier.
Tous les objets que j'essayais de sauver étaient dans la même classe (j'aurais dû le mentionner auparavant), et je n'avais pas réalisé que je pouvais juste sauver toute la classe de la manière suivante:

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'
78
jvandereay

Si vous avez besoin de sauvegarder plusieurs objets, vous pouvez simplement les mettre dans une seule liste, ou tuple, par exemple:

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 vous avez beaucoup de données, vous pouvez réduire la taille du fichier en passant de protocol=-1 à dump(); pickle utilisera alors le meilleur protocole disponible au lieu du protocole historique (et plus compatible avec les versions antérieures) par défaut. Dans ce cas, le fichier doit être ouvert en mode binaire (wb et rb, respectivement).

Le mode binaire doit également être utilisé avec Python 3, car son protocole par défaut génère des données binaires (c'est-à-dire non textuelles) (mode écriture 'wb' et mode lecture 'rb').

129
Eric O Lebigot

Il existe une bibliothèque intégrée appelée pickle . En utilisant pickle , vous pouvez vider des objets dans un fichier et les charger plus tard.

import pickle

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

f = open('store.pckl', 'rb')
obj = pickle.load(f)
f.close()
36
Yossi

Vous devriez regarder les modules shelve et pickle . Si vous avez besoin de stocker beaucoup de données, il peut être préférable d’utiliser une base de données.

10
John La Rooy

Vous pouvez utiliser klepto, qui fournit une mise en cache persistante dans la mémoire, le disque ou la 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()
>>> 

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

4
Mike McKerns

Une autre approche pour enregistrer plusieurs variables dans un fichier pickle est la suivante:

import pickle

a = 3; b = [11,223,435];
pickle.dump([a,b], open("trial.p", "wb"))

c,d = pickle.load(open("trial.p","rb"))

print(c,d) ## To verify
1

L’approche suivante semble simple et peut être utilisée avec des variables de taille différente:

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)
0
devil in the detail