Поглиблений курс розробки на 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 як аргумент, щоб десеріалізувати зразкові дані, зібрані до цього моменту. Використовуйте функцію display() та додайте функцію pformat() зі змінною output для перегляду даних. Наприклад: await player.display(pformat(output)). Занотуйте рейтинги для кожного місяця, відображені в терміналі, щоб потім їх можна було занести в таблицю.

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

Книга Коду