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

226voto

EOL Points 24342

Si vous devez enregistrer plusieurs objets, vous pouvez simplement les placer dans une liste unique, ou un 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 la commande protocol=-1 à dump() ; pickle utilisera alors le meilleur protocole disponible au lieu du protocole historique (et plus rétrocompatible) par défaut. Dans ce cas, le fichier doit être ouvert en mode binaire ( wb y rb respectivement).

Le mode binaire doit également être utilisé avec Python 3, car son protocole par défaut produit des données binaires (c'est-à-dire sans texte) (mode d'écriture 'wb' et le mode de lecture 'rb' ).

60voto

Yossi Points 4922

Il existe une bibliothèque intégrée appelée pickle . Utilisation de pickle vous pouvez vider les 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()

1 votes

J'utilise Python 3.4 : f = open('store.pckl', 'wb') pour ouvrir un fichier dans lequel écrire. Se référer à stackoverflow.com/questions/13906623/ Et utilisez `f = open('store.pckl', 'rb') pour ouvrir un fichier à lire. Reportez-vous à stackoverflow.com/questions/7031699/ .

0 votes

Est-ce spécifique à la version 3.4+ ? J'ai failli rejeter la réponse car elle génère des erreurs lorsque vous n'utilisez pas 'b'.

1 votes

La question était "Comment sauvegarder et restaurer plusieurs variables en python ?". Veuillez mettre à jour votre réponse pour savoir comment gérer plusieurs variables dans un pickle, au lieu d'une seule variable.

14voto

Une autre approche consiste à enregistrer plusieurs variables dans un fichier pickle :

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

13voto

gnibbler Points 103484

Vous devriez regarder le mettre en rayon y cornichon modules. Si vous devez stocker un grand nombre de données, il est préférable d'utiliser une base de données.

0 votes

Je veux sauvegarder un objet unique qui se connecte à un serveur en nuage, afin de gérer le fait que si je me connecte plusieurs fois au fil du temps, le serveur rejette ma demande. Est-ce que le fait de vider un objet dans un fichier en utilisant le module pickle peut poser un problème de sécurité ? Par exemple, si quelqu'un obtient mon objet vidé, il peut se connecter à mon stockage en nuage sans utiliser de mot de passe.

9voto

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)

1 votes

hickle est plus robuste (moins sujet aux erreurs) et encore plus simple (moins de code) que le paquet pickle .

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