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