Работа с pickle

Модуль 1: Python Core
12 уровень , 8 лекция
Открыта

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 Сериализация в файл

Основные шаги сериализации в файл:

  1. Открытие файла в режиме записи байтов (wb).
  2. Сериализация объекта с использованием pickle.dump(obj, file).
  3. Для десериализации объекта используем pickle.load(file).
  4. Закрытие файла.

Сериализация и десериализация объекта в файл

В принципе 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. Это называется проблема миграции, и с ней очень часто сталкиваются в долгоживущих и востребованных проектах.

2
Задача
Модуль 1: Python Core, 12 уровень, 8 лекция
Недоступна
Сериализация списка в файл
Сериализация списка в файл
2
Задача
Модуль 1: Python Core, 12 уровень, 8 лекция
Недоступна
Сериализация словаря в строку
Сериализация словаря в строку
Комментарии (3)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Ахмад Уровень 35
1 сентября 2025
Интересно, что задания текущей лекции во многом перекликаются с предыдущей — похоже, это такой способ отработать навыки до автоматизма.
Елена Шорохова Уровень 64
28 мая 2025
Я думаю, что задачи все же надо делать такие, чтобы было недостаточно скопировать код из примеров лекции и изменить какую-то мелочь. Иногда надо просто скопировать. Ну камон
Anonymous #2662922 Уровень 30
17 марта 2025
В четвертом пункте требований ко второй задаче допущена опечатка в слове "здесериализации", скорее всего подразумевалось "десериализации"