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

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

Как использовать 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>




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

Источник

НЕТ КОММЕНТАРИЕВ

Оставить комментарий