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, която съдържа данни, събрани от станцията.

Създайте променлива, наречена 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() и ще зададем като аргументи константата sample и съответния 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() и добавете функцията pprint() с променливата output, за да видите данните. По следния начин: await player.display(pprint(output)). Обърнете внимание на рейтингите за всеки месец, показани в терминала, за да ги запишете по-късно.

Отидете към тъмния X знак върху червения килим и се обърнете към бюрото. В предварително написаната функция write(), добавете рейтингите, които записахте за всеки месец, които преди това бяха показани в терминала. Добавете ги като низове, поставени в "" кавички, в правилния ред както са описани във функцията, за да завършите нивото.

Книга с Код