9.1 Знакомство с pickle
Модуль pickle позволяет сохранить практически любой объект Python в файл или строку, а затем восстановить его в исходное состояние. pickle поддерживает множество типов данных, включая пользовательские объекты классов, и автоматизирует процесс преобразования объектов в байтовый формат и обратно.
Основные функции модуля pickle
- Чтение и запись объекта в файл
-
pickle.dump(obj, file): Сериализует объектobjи записывает его в открытый файлfile. -
pickle.load(file): Читает из файлаfileи десериализует объект.
-
- Чтение и запись объекта в массив байт
-
pickle.dumps(obj): Сериализует объектobjи возвращает его как байтовый объект. -
pickle.loads(bytes): Десериализует объект из байтового объекта.
-
Ниже мы разберем их немного более подробно:
9.2 Сериализация в файл
Основные шаги сериализации в файл:
- Открытие файла в режиме записи байтов
(wb). - Сериализация объекта с использованием
pickle.dump(obj, file). - Для десериализации объекта используем
pickle.load(file). - Закрытие файла.
Сериализация и десериализация объекта в файл
В принципе pickle все равно, что сериализовать. Например, так выглядит сериализация списка:
import pickle
data = [1, 2, 3, 4, 5]
# Сериализация списка в файл
with open('list.pkl', 'wb') as file:
pickle.dump(data, file)
# Десериализация списка из файла
with open('list.pkl', 'rb') as file:
loaded_data = pickle.load(file)
print(loaded_data) # Вывод: [1, 2, 3, 4, 5]
А вот так выглядит сериализация объекта словаря:
import pickle
# Пример объекта для сериализации
data = {'name': 'Alice', 'age': 30, 'is_student': False}
# Сериализация объекта в файл
with open('data.pkl', 'wb') as file:
pickle.dump(data, file)
# Десериализация объекта из файла
with open('data.pkl', 'rb') as file:
loaded_data = pickle.load(file)
print(loaded_data) # Вывод: {'name': 'Alice', 'age': 30, 'is_student': False}
Хотим сохранить объект — вызываем dump(), хотим загрузить — вызываем load(). Ничего сложного.
9.3 Сериализация в строку
Очень часто объекты нужно передать по сети, поэтому объект нужно сохранить не в файл, а в строку. Для этого у pickle есть методы dumps и loads с дополнительной s на конце.
Основные действия для сериализации и десериализации в строку (или массив байт):
- Сериализация объекта с использованием
pickle.dumps(obj). - Для десериализации объекта используем
pickle.loads(data).
Сериализация и десериализация объекта в строку
Сериализация объекта в строку (или набор байт) ещё проще — вам нужно вызвать один метод — dumps().
Пример:
import pickle
# Пример объекта для сериализации
data = {'name': 'Bob', 'age': 25, 'is_student': True}
# Сериализация объекта в строку
serialized_data = pickle.dumps(data)
print(serialized_data)
# Десериализация объекта из строки
loaded_data = pickle.loads(serialized_data)
print(loaded_data) # Вывод: {'name': 'Bob', 'age': 25, 'is_student': True}
9.4 Ошибки при сериализации
Иногда при сериализации возникают ошибки. В этом случае модуль pickle будет кидать исключения:
-
pickle.PicklingError— ошибка во время сериализации. -
pickle.UnpicklingError— ошибка во время десериализации.
Примеры:
import pickle
data = {'key': 'value'}
try:
# Сериализация объекта в файл
with open('data.pkl', 'wb') as file:
pickle.dump(data, file)
except pickle.PicklingError as e:
print(f"Ошибка сериализации: {e}")
try:
# Десериализация объекта из файла
with open('data.pkl', 'rb') as file:
loaded_data = pickle.load(file)
print(loaded_data)
except pickle.UnpicklingError as e:
print(f"Ошибка десериализации: {e}")
Обычно вы как программист ничего не можете сделать с ошибкой сериализации/десериализации во время работы программы. Всё, что вы можете — это сохранить её в лог, чтобы в будущем разобраться, почему же это произошло.
Основная причина таких ошибок — это изменение формата объекта. Вы сохранили объект в файл, потом ваша программа обновилась, и у объекта появились новые поля или исчезли старые. И вот старый сохранённый объект пытаются загрузить в класс нового объекта…
Опять-таки, эта ситуация часто встречается при работе с сетью — программа версии 2.18 отсылает немного не тот объект, который ждёт программа версии 3.1. Это называется проблема миграции, и с ней очень часто сталкиваются в долгоживущих и востребованных проектах.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ