Продвинутый курс разработки на Python
Глава
>
Уровень
Модули сериализации
Модули Marshal и Pickle
Цель
Пройдите на заправочную станцию и убедитесь, что данные правильно сохранены, используя модуль JSON для форматирования файлов.
Продолжая путь, мы находим несколько станций, контролирующих распределение воды и качество почвы на участке, который разрабатывается для будущего урожая. Для обработки данных эффективно их сериализовать. Хотя использование Json может быть эффективным обобщённым решением, также существуют несколько специфичных для Python методов сериализации, а именно модули Marshal и Pickle. Модуль Marshal предназначен для быстрой сериализации/десериализации путём преобразования данных в двоичный формат, что идеально подходит для более простых передач данных. Модуль Pickle медленнее, но он предназначен для обработки более сложных структур данных и является намного более гибким, что идеально подходит для больших или приоритетных структур данных.
Чтобы использовать модули Marshal и Pickle, импортируйте их функции, написав: import marshal и import pickle. Для наших целей мы будем использовать следующие функции:
marshal.dumps(): Сериализует данные в двоичный формат, разработанный для скорости в Python. Принимает один аргумент, а именно данные, которые вы хотите сериализовать, и ограничен базовыми типами данных.marshal.loads(): Десериализует двоичные данные в читаемые Python типы данных, ограниченные в возможностях, но с быстрой обработкой. Принимает один аргумент, а именно данные для десериализации.pickle.DEFAULT_PROTOCOL: Проверяет, какая версия протокола сериализации Pickle является стандартной в вашей версии Python. Протоколы влияют на способ сериализации данных.pickle.HIGHEST_PROTOCOL: Проверяет, какая версия протокола сериализации Pickle является наивысшей, доступной в вашей версии Python. Протоколы влияют на способ сериализации данных.pickle.dumps(): Сериализует сложные структуры данных Python в двоичный формат согласно используемому протоколу. Принимает два аргумента: данные, которые вы хотите сериализовать, и версию протокола, которую вы хотите использовать при сериализации.pickle.loads(): Десериализует двоичные данные в читаемые Python типы данных, обладая широкими возможностями для Python объектов. Принимает один аргумент, а именно данные, которые вы хотите десериализовать.
В дополнение к этим модулям и функциям мы также будем использовать модуль для форматирования под названием pformat, который мы импортируем с помощью from pprint import pformat. Это позволяет нам использовать функцию pformat(), которая может форматировать структуры данных, такие как словари, позволяя нам ясно отображать информацию.
Чтобы начать, пройдите к маркированному светом X внутри небольшой станции мониторинга и повернитесь к компьютерному терминалу. Станция контролирует водяное давление и состояние почвы в прилегающем районе, который разрабатывается для посадки культур. Существует константа с именем reading, которая содержит данные Python, собранные станцией.
Создайте переменную с именем data и сохраните в ней значение функции marshal.dumps(), передав reading в качестве аргумента. Вот так: data = marshal.dumps(reading). Используйте переменную data с заранее написанной функцией display(), чтобы просмотреть данные сериализованной переменной.
Выйдите из станции и направляйтесь к золотому X, используйте функцию open(), чтобы открыть дверь и получить доступ в офис. Подойдите к световому X перед терминалом и десериализуйте данные, которые вы только что сериализовали. Создайте переменную с именем output и сохраните в ней значение функции marshal.loads(), передав в качестве аргумента предыдущую переменную data. Используйте функцию write(), добавив output в качестве аргумента, чтобы получить доступ к сериализованным данным, собранным со станции мониторинга.
Подойдите к световому X на синем ковре в офисе, на терминале мы проверим протоколы, чтобы определить, какой тип сериализации будет использовать модуль pickle при обработке данных. В заранее написанной функции write() укажите аргументы как pickle.DEFAULT_PROTOCOL и pickle.HIGHEST_PROTOCOL. Это проверит, какой текущий протокол сериализации, а также последний доступный протокол сериализации на данный момент.
Перейдите к тёмному X на синем ковре, теперь, когда мы подтвердили протоколы, мы можем проверить сохранённые данные. Данные собирались и сохранялись на протяжении нескольких месяцев и хранятся в константе с именем samples. Создайте три переменные с именами: sereal_0, sereal_2 и sereal_5; мы будем использовать их для проверки трёх доступных протоколов сериализации. Протокол 0 представляет читаемый ASCII, не очень эффективный, протокол 2 — более эффективный двоичный формат, а протокол 5 — самый последний с наиболее сложными дополнениями.
Мы сохраним значение функции pickle.dumps() и укажем в качестве аргументов константу samples и protocol, соответствующий номеру в имени переменной. Например, для sereal_0 мы установим protocol как 0, вот так: sereal_0 = pickle.dumps(samples, protocol=0). Используйте sereal_0, sereal_2 и sereal_5 с заранее написанной функцией display(), чтобы увидеть, насколько различна сериализация для каждого протокола.
Подойдите к световому X на красном ковре и повернитесь к терминалу, перезапишите переменную output и сохраните в неё значение функции pickle.loads(), передав в качестве аргумента sereal_5, чтобы десериализовать собранные до сих пор данные samples. Используйте функцию display() и добавьте функцию pformat() с переменной output, чтобы просмотреть данные. Вот так: await player.display(pformat(output)). Обратите внимание на рейтинги за каждый месяц, отображённые на терминале, чтобы позже вы могли их записать.
Подойдите к тёмному X на красном ковре и повернитесь к столу, в заранее написанной функции write() добавьте рейтинги, которые вы записали для каждого месяца, ранее отображённые на терминале. Добавьте их в виде строк с кавычками "" в правильном порядке, как они указаны в функции, чтобы завершить уровень.