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