JavaRush /Курсы /Модуль 1: Python Core /Сериализация

Сериализация

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

8.1 Что такое сериализация

После того как вы научились работать с файлами, сохранять и читать данные, настало время научиться работать с файлами серьёзно. Сегодня мы с вами начнем изучать сериализацию.

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

Чтобы сохранить объект в файл (или передать его по сети), нужно преобразовать его в некую строку (или набор байт), которую будет легко записать в файл (и считать из файла) или передать по сети.

Вот 4 основных направления, где используется сериализация:

  • Сохранение состояния объектов: Чтобы сохранить состояние объекта между запусками программы.
  • Передача данных: Чтобы передавать объекты по сети между различными компонентами системы или между разными системами.
  • Кэширование: Чтобы сохранить объекты в кэше для быстрого доступа.
  • Базы данных: Чтобы хранить сложные структуры данных в базах данных.

Библиотек, которые занимаются сериализацией, очень много, и каждая создана под свои нужды. Мы ознакомимся с пятью из них, а с двумя это знакомство будет очень подробным.

Рассмотрим наиболее популярные из них:

  • Модуль pickle
  • Модуль json
  • Модуль yaml
  • Модуль marshal
  • Модуль shelve

Ниже будет краткий обзор каждого из них:

8.2 Модуль pickle

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

Пример использования pickle:


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)

8.3 Модуль json

json — это встроенный модуль для работы с JSON (JavaScript Object Notation). JSON — это текстовый формат, который используется для обмена данными между клиентом и сервером.

Пример использования json:


import json

# Пример объекта для сериализации
data = {'name': 'Bob', 'age': 25, 'is_student': True}
            
# Сериализация объекта в строку JSON
json_string = json.dumps(data)
print(json_string)
            
# Сериализация объекта в файл JSON
with open('data.json', 'w') as file:
    json.dump(data, file)
            
# Десериализация объекта из строки JSON
loaded_data = json.loads(json_string)
print(loaded_data)
            
# Десериализация объекта из файла JSON
with open('data.json', 'r') as file:
    loaded_data = json.load(file)
print(loaded_data)

8.4 Модуль yaml

yaml (YAML Ain't Markup Language) — это человекочитаемый формат сериализации данных. Для работы с YAML в Python используется сторонняя библиотека PyYAML.

Пример использования yaml:


import yaml

# Пример объекта для сериализации
data = {'name': 'Carol', 'age': 27, 'is_student': False}
            
# Сериализация объекта в строку YAML
yaml_string = yaml.dump(data)
print(yaml_string)
            
# Сериализация объекта в файл YAML
with open('data.yaml', 'w') as file:
    yaml.dump(data, file)
            
# Десериализация объекта из строки YAML
loaded_data = yaml.load(yaml_string, Loader=yaml.FullLoader)
print(loaded_data)
            
# Десериализация объекта из файла YAML
with open('data.yaml', 'r') as file:
    loaded_data = yaml.load(file, Loader=yaml.FullLoader)
print(loaded_data)

8.5 Модуль marshal

marshal — это встроенный модуль для сериализации объектов Python, который используется для сериализации кода Python. Он быстрее pickle, но поддерживает меньше типов объектов и не так гибок.

Пример использования marshal:


import marshal

# Пример объекта для сериализации
data = {'name': 'Dave', 'age': 35, 'is_student': True}

# Сериализация объекта в файл
with open('data.marshal', 'wb') as file:
    marshal.dump(data, file)
            
# Десериализация объекта из файла
with open('data.marshal', 'rb') as file:
    loaded_data = marshal.load(file)
            
print(loaded_data)

8.6 Модуль shelve

shelve — это встроенный модуль, который предоставляет простую возможность сохранять объекты Python в файлы с использованием хранилища на основе ключей, похожего на словарь.

Пример использования shelve:


import shelve

# Пример объекта для сериализации
data = {'name': 'Eve', 'age': 28, 'is_student': False}
            
# Сериализация объекта в файл
with shelve.open('data.shelve') as db:
    db['person'] = data
            
# Десериализация объекта из файла
with shelve.open('data.shelve') as db:
    loaded_data = db['person']
            
print(loaded_data)

И хотя сами модули и формат сохранения данных отличаются, работа с ними с точки зрения программиста очень похожа. Ниже мы более подробно разберем работу с модулем pickle и модулем json.

2
Задача
Модуль 1: Python Core, 12 уровень, 7 лекция
Недоступна
Сериализация помощью pickle
Сериализация помощью pickle
2
Задача
Модуль 1: Python Core, 12 уровень, 7 лекция
Недоступна
Сериализация с помощью yaml
Сериализация с помощью yaml
Комментарии (8)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Anonymous #2662922 Уровень 30
17 марта 2025
Во второй задаче обратите внимание, что создать нужно именно сериализованную строку формата YAML, а не сериализованный файл, также нужно вывести на экран и сериализованную, и десериализованную строки
Japan_Dragon Уровень 32
25 февраля 2025
Первая задача даже импорт не засчитывает за корректный пункт
29 января 2025
Повторная проверка второй задачи, без какого-либо изменения film_info - лечит проверку (это при условии, что остальные условия задачи соблюдены)
Екатерина Уровень 80
13 сентября 2024
Вторая задача. Не проходит проверку на создание словаря с дефолтным кодом задачи. Нужно переименовать ключи словаря на те, что в условии задачи.
Павел Гапченко Уровень 27
31 декабря 2024
Комментарий был написан сентябре, а в декабре ничего не поменялось. Всем по барабану на недоработки
Денис Уровень 33
5 января 2025
Ну если что у меня с таким объектом только что приняло:

film_info = {
    'title': 'Inception',
    'director': 'Christopher Nolan',
    'year': 2010
}
Сергей Уровень 25
5 января 2025
а меня поправил исправить исходный словарь на:

film_info = {
    'название': 'Inception',
    'режиссёр': 'Christopher Nolan',
    'год выпуска': 2010
}
9 октября 2025
режиссёр обязательно через Ё иначе валидатор не примет...