Как использовать 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>
В общем, если вы хотите десериализоавать определенный пользователем объект, вам необходимо реализовать его класс в текущей области видимости, в противном случае это вызовет ошибку.
-
- Михаил Русаков
Комментарии (0):
Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.