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

Введение

Примеры

  • 2

    Использование 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 
  • 1

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

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

    Что будет маринованные может быть определена в __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__ бы инициализирована , если она была вызвана.

Синтаксис

Параметры

Примечания