Coding for KidsCoding for Kids
Творческие УровниИспытанияРуководство для Учителей
Голосовать за функции
Продвинутый курс разработки на 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. Принимает один аргумент – данные, которые вы хотите десериализовать.

В дополнение к этим модулям и функциям, мы будем использовать модуль для форматирования с именем pprint, который импортируется с помощью from pprint import pprint. Это позволяет нам использовать функцию pprint(), с помощью которой можно форматировать структуры данных, такие как словари, что позволяет четко отображать информацию.

Для начала пройдите к световому 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 и протокол, соответствующий номеру в имени переменной. Например, для sereal_0 мы установим protocol равным 0, как это: sereal_0 = pickle.dumps(samples, protocol=0). Используйте переменные sereal_0, sereal_2 и sereal_5 с предварительно написанной функцией display(), чтобы проверить, насколько различается сериализация для каждого протокола.

Пройдите к световому X-образному знаку на красном ковре и обратитесь к терминалу, перезапишите переменную output и сохраните в нее значение функции pickle.loads(), передав в качестве аргумента sereal_5, чтобы десериализовать данные образца, собранные до сих пор. Используйте функцию display(), добавив функцию pprint() с переменной output, чтобы просмотреть данные. Например: await player.display(pprint(output)). Обратите внимание на рейтинги за каждый месяц, отображаемые в терминале, чтобы позже нанести их на диаграмму.

Пройдите к темному X-образному знаку на красном ковре и обратитесь к столу, в предварительно написанной функции write() добавьте рейтинги, которые вы отметили за каждый месяц, ранее отображавшиеся в терминале. Добавьте их в виде строк с кавычками "" в правильном порядке, как указано в функции, чтобы завершить уровень.

Книга Кода