web-dev-qa-db-fra.com

Quelle est la différence entre les cornichons et les étagères?

J'apprends la sérialisation d'objets pour la première fois. J'ai essayé de lire et de "googler" pour les différences dans les modules cornichon et étagère, mais je ne suis pas sûr de le comprendre. Quand utiliser lequel? Pickle peut transformer chaque python objet en un flux d'octets qui peut être conservé dans un fichier. Alors pourquoi avons-nous besoin du module de stockage? N'est-ce pas pickle plus rapide?

61
zubinmehta

pickle sert à sérialiser un ou plusieurs objets (ou objets) en un seul bytestream dans un fichier.

shelve s'appuie sur pickle et implémente un dictionnaire de sérialisation où les objets sont décapés, mais associés à une clé (une chaîne), de sorte que vous pouvez charger votre fichier de données en attente et accéder à vos objets décapés via clés. Cela pourrait être plus pratique si vous sérialisiez de nombreux objets.

Voici un exemple d'utilisation entre les deux. (devrait fonctionner dans les dernières versions de Python 2.7 et Python 3.x).

pickle Exemple

import pickle

integers = [1, 2, 3, 4, 5]

with open('pickle-example.p', 'wb') as pfile:
    pickle.dump(integers, pfile)

Cela videra la liste integers dans un fichier binaire appelé pickle-example.p.

Essayez maintenant de lire le fichier mariné.

import pickle

with open('pickle-example.p', 'rb') as pfile:
    integers = pickle.load(pfile)
    print integers

Ce qui précède devrait produire [1, 2, 3, 4, 5].

shelve Exemple

import shelve

integers = [1, 2, 3, 4, 5]

# If you're using Python 2.7, import contextlib and use
# the line:
# with contextlib.closing(shelve.open('shelf-example', 'c')) as shelf:
with shelve.open('shelf-example', 'c') as shelf:
    shelf['ints'] = integers

Remarquez comment vous ajoutez des objets à l'étagère via un accès de type dictionnaire.

Lisez l'objet en arrière avec du code comme celui-ci:

import shelve

# If you're using Python 2.7, import contextlib and use
# the line:
# with contextlib.closing(shelve.open('shelf-example', 'r')) as shelf:
with shelve.open('shelf-example', 'r') as shelf:
    for key in shelf.keys():
        print(repr(key), repr(shelf[key])))

La sortie sera 'ints', [1, 2, 3, 4, 5].

82
wkl