Поглиблений курс розробки на 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() додайте оцінки, які ви занотували для кожного місяця та які раніше відображалися в терміналі. Додайте їх як рядки в лапках "" у правильному порядку, як це вказано у функції, для завершення рівня.