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

Сериализация объектов — это процесс преобразования структур данных или состояния объекта в формат, который может быть сохранен в файле или передан и восстановлен позже. В этой статье вы узнаете, как использовать встроенный модуль pickle для сериализации и десериализации объектов в Python.

Сериализацию в Python часто называют консервацией или pickling. Pickling — это просто процесс, посредством которого иерархия объектов Python преобразуется в поток байтов, а распаковка — это обратная операция.

Давайте начнем с определения базовых структур данных Python:


import pickle

# определим любую структуру данных, включая список, кортеж и т.д.
l = list(range(10000))

Я использовал здесь список, содержащий 10000 элементов, только для демонстрационных целей, вы можете использовать любой объект Python, приведенный ниже код сохраняет этот список в файл:


# save it to a file
with open("list.pickle", "wb") as file:
    pickle.dump(l, file)

pickle.dump(obj, file) записывает обработанное представление obj (в данном случае список) в открытый файл (в режиме записи и байтов «wb»), давайте загрузим этот объект снова:


# load it again
with open("list.pickle", "rb") as file:
    unpickled_l = pickle.load(file)

pickle.load(file) считывает и возвращает объект данных из консервации, хранящихся в файле (открытом в режиме чтения и байтов «rb»), сравнивая исходный и необработанный объект:


print("unpickled_l == l: ", unpickled_l == l)
print("unpickled l is l: ", unpickled_l is l)

# вывод

unpickled_l == l:  True
unpickled l is l:  False

Значения списка по-прежнему одинаковы (равны), но он не идентичен, другими словами, у не отмеченного списка есть другое место в памяти, так что это буквально копия исходного объекта.

Вы также можете сохранять и загружать экземпляры объектов пользовательских классов. Например, давайте определим простой класс Site:


import pickle
import datetime
import sys

class Site:
    def __init__(self, site_name, site_domen, lang):
        self.site_name = site_name
        self.site_domen = site_domen
        self.lang = lang
        self.time = datetime.datetime.now()

    def __str__(self):
        return f"Название сайта={self.site_name}.{self.site_domen}, язык сайта={self.lang}, текущее время={self.time}>"

p = Site("Myrusakov", "ru", "Python")

# Давайте повторим тот же процесс еще раз:

# сохраним объект
with open("site.pickle", "wb") as file:
    pickle.dump(p, file)

# загрузим его
with open("site.pickle", "rb") as file:
    p2 = pickle.load(file)

print(p)
print(p2)

# вывод

'''
Если сохранить состояние экземпляра класса Site, а затем загрузить его, то можно обнаружить, что сохраненное время идентично
'''

Название сайта=Myrusakov.ru, язык сайта=Python, текущее время=2022-01-11 10:53:40>
Название сайта=Myrusakov.ru, язык сайта=Python, текущее время=2022-01-11 10:53:40>

В общем, если вы хотите десериализоавать определенный пользователем объект, вам необходимо реализовать его класс в текущей области видимости, в противном случае это вызовет ошибку.

Источник