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