2010-08-04 5 views
1

Je ne sais pas pourquoi cet exemple Pickle ne montre pas les deux définitions du dictionnaire. Si je comprends bien, "ab +" devrait signifier que le fichier pickle.dat est ajouté et peut être lu. Je suis nouveau dans le concept du pickle entier, mais les tutoriels sur le net ne semblent pas aller au-delà du stockage initial.Python Pickle Aide

import cPickle as pickle 

def append_object(d, fname): 
    """appends a pickle dump of d to fname""" 
    print "append_hash", d, fname 
    with open(fname, 'ab') as pickler: 
     pickle.dump(d, pickler) 

db_file = 'pickle.dat' 

cartoon = {} 
cartoon['Mouse'] = 'Mickey' 
append_object(cartoon, db_file) 

cartoon = {} 
cartoon['Bird'] = 'Tweety' 
append_object(cartoon, db_file) 

print 'loading from pickler' 
with open(db_file, 'rb') as pickler: 
    cartoon = pickle.load(pickler) 
print 'loaded', cartoon 

Idéalement, j'espérais construire un dictionnaire en utilisant une boucle et puis ajoutez la clé: paire de valeurs dans le fichier pickle.dat, puis désactivez le dictionnaire pour sauver un peu de RAM.

Que se passe-t-il ici?

+0

Ne doublez pas l'espace de votre code. Indentez-le par quatre espaces à la place. –

Répondre

5

Utilisez une base de données.

Python dbm module semble correspondre à ce que vous voulez parfaitement. Il vous présente une interface de type dictionnaire, mais les données sont sauvegardées sur le disque.

Exemple d'utilisation:

>>> import dbm 
>>> x = dbm.open('/tmp/foo.dat', 'c') 
>>> x['Mouse'] = 'Mickey' 
>>> x['Bird'] = 'Tweety' 

Demain, vous pouvez charger les données:

>>> import dbm 
>>> x = dbm.open('/tmp/foo.dat', 'c') 
>>> print x['Mouse'] 
Mickey 
>>> print x['Bird'] 
Tweety 
+0

Oh my gosh !!! Ce module dbm est génial! Merci beaucoup !!!! Je vais certainement essayer – Brian

+0

Notez aussi: Selon le site web de Python: "Le module dbm a été renommé en dbm. ndbm dans Python 3.0 L'outil 2to3 adaptera automatiquement les imports lors de la conversion de vos sources vers la version 3.0. " – Brian

+0

Aussi, je viens de remarquer qu'il s'agit d'un module pour Unix, je code sous windows 7 .... – Brian

3

J'ai commencé à éditer votre code pour plus de lisibilité et j'en ai exclu append_object dans le processus.

Il y a plusieurs confusions ici. Le premier, est que pickle.dump écrit un objet Python dans son intégralité. Vous pouvez placer plusieurs objets dans un fichier Pickle, mais chacun a besoin de ses propres load. Le code a fait ce que vous lui avez demandé et a chargé le premier dictionnaire que vous avez écrit dans le fichier. Le deuxième dictionnaire était là en attente d'être lu mais ce n'est pas une concaténation au premier, c'est son propre loadable. Ne pas sous-estimer l'importance des noms.

append_object n'est pas un grand nom, mais il est différent de append_to_object.

Si vous ouvrez un fichier à lire, ouvrez-le pour la lecture et le même pour l'écriture ou l'ajout. Non seulement cela rend vos intentions plus claires, mais cela évite les erreurs stupides. Ne pas utiliser de cornichon pour cela.

+0

Merci d'avoir mis mon code dans le bloc ... J'ai essayé de le comprendre. Comment tu fais ça? Selon la référence, il semble que je tape simplement un caractère de guillemets simples au début et à la fin de ce que je veux être dans le bloc de code. Mais cela n'a pas fonctionné pour moi ... = ( – Brian

+0

@Brian, vous faites cela pour le code en ligne.Pour les gros blocs de code, vous ajoutez quatre espaces au début de chaque ligne de code, ou vous pouvez simplement écrire le code sans espaces, mettez-le en surbrillance, puis cliquez sur le bouton "exemple de code" qui ressemble à 1 et 0. – Wilduck

+0

Je ne sais toujours pas comment réviser le code ci-dessus pour contenir les deux définitions dans le fichier pickle ... – Brian