В чем разница между рассолом и полкой? - PullRequest
58 голосов
/ 05 ноября 2010

Я впервые узнаю о сериализации объектов. Я пробовал читать и «гуглить» из-за различий в модуле «соление» и «полка», но я не уверен, что понимаю это. Когда использовать какой? Pickle может превратить каждый объект python в поток байтов, который можно сохранить в файле. Тогда зачем нам модуль полки? Разве рассол не быстрее?

1 Ответ

80 голосов
/ 05 ноября 2010

pickle предназначен для сериализации некоторого объекта (или объектов) в виде единого потока данных в файле.

shelve основывается на pickle и реализует словарь сериализации, в котором объекты выбираются, носвязан с ключом (некоторой строкой), так что вы можете загрузить отложенный файл данных и получить доступ к засоленным объектам с помощью ключей.Это может быть более удобно, если вы сериализуете много объектов.

Вот пример использования между ними.(должно работать в последних версиях Python 2.7 и Python 3.x).

pickle Пример

import pickle

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

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

Это приведет к выводу списка integers в двоичный файл с именем pickle-example.p.

Теперь попробуйте прочитать обратно маринованный файл.

import pickle

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

Приведенное выше должно вывести [1, 2, 3, 4, 5].

shelve Пример

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

Обратите внимание, как вы добавляете объекты на полку с помощью словарного доступа.

Считайте объект обратно с помощью кода, подобного следующему:

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

Вывод будет 'ints', [1, 2, 3, 4, 5].

...