Документация по Python

Сериализация данных с pickle

В: Документация по Python

Введение

Примеры

Использование Pickle для сериализации и десериализации объекта

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

Для простейшего кода, мы используем dump() и load() функцию.

Для сериализации объекта

 import pickle

# An arbitrary collection of objects supported by pickle.
data = {
    'a': [1, 2.0, 3, 4+6j],
    'b': ("character string", b"byte string"),
    'c': {None, True, False}
}

with open('data.pickle', 'wb') as f:
    # Pickle the 'data' dictionary using the highest protocol available.
    pickle.dump(data, f, pickle.HIGHEST_PROTOCOL)

 

Для десериализации объекта

 import pickle

with open('data.pickle', 'rb') as f:
    # The protocol version used is detected automatically, so we do not
    # have to specify it.
    data = pickle.load(f)

 

Использование объектов pickle и byte

Кроме того , можно сериализовать в и десериализации из объектов байтов, используя dumps и loads функции, которые эквивалентны dump и load .

 serialized_data = pickle.dumps(data, pickle.HIGHEST_PROTOCOL)
# type(serialized_data) is bytes

deserialized_data = pickle.loads(serialized_data)
# deserialized_data == data 

Настроить маринованные данные

Некоторые данные не могут быть засолены. Другие данные не следует собирать по другим причинам.

Что будет маринованные может быть определена в __getstate__ методом. Этот метод должен возвращать что-то, что можно выбрать.

На на противоположной стороне __setstate__ : он получит то , что __getstate__ создан и должно инициализировать объект.

 class A(object):
    def __init__(self, important_data):
        self.important_data = important_data

        # Add data which cannot be pickled:
        self.func = lambda: 7

        # Add data which should never be pickled, because it expires quickly:
        self.is_up_to_date = False

    def __getstate__(self):
        return [self.important_data] # only this is needed

    def __setstate__(self, state):
        self.important_data = state[0]

        self.func = lambda: 7  # just some hard-coded unpicklable function

        self.is_up_to_date = False  # even if it was before pickling


 

Теперь это можно сделать:

 >>> a1 = A('very important')
>>>
>>> s = pickle.dumps(a1)  # calls a1.__getstate__()
>>>
>>> a2 = pickle.loads(s)  # calls a1.__setstate__(['very important'])
>>> a2
<__main__.A object at 0x0000000002742470>
>>> a2.important_data
'very important'
>>> a2.func()
7

 

Реализация здесь pikles список с одним значением: [self.important_data] . Это просто пример, __getstate__ мог бы вернуться все , что пригодны для консервирования, до тех пор , как __setstate__ знает , как сделать oppoisite. Хорошей альтернативой является словарем всех значений: {'important_data': self.important_data} .

Конструктор не называется! Обратите внимание , что в предыдущем примере экземпляр a2 был создан в pickle.loads никогда не называя A.__init__ , так A.__setstate__ пришлось инициализировать все , что __init__ бы инициализирована , если она была вызвана.

Синтаксис

Параметры

Примечания

Еще от кодкамп
Замечательно! Вы успешно подписались.
Добро пожаловать обратно! Вы успешно вошли
Вы успешно подписались на кодкамп.
Срок действия вашей ссылки истек.
Ура! Проверьте свою электронную почту на наличие волшебной ссылки для входа.
Успех! Ваша платежная информация обновлена.
Ваша платежная информация не была обновлена.