Curso Avançado de Desenvolvimento Python
Capítulo
>
Nível
Módulos de Serialização
Módulos Marshal e Pickle
Objetivo
Vá até a estação de serviço e certifique-se de que os dados estão armazenados corretamente utilizando o módulo JSON para formatar os arquivos.
Continuando pelo caminho, encontramos algumas estações monitorando a distribuição de água e a qualidade do solo do terreno que está sendo desenvolvido para uma futura colheita. Para processar os dados, é eficiente serializá-los. Embora o uso de JSON possa ser eficaz como solução generalizada, existem também alguns métodos específicos de serialização do Python, a saber, os módulos Marshal e Pickle. O módulo Marshal foi projetado para uma serialização/desserialização rápida, convertendo os dados em binário, o que o torna ideal para transferências de dados mais simples. O módulo Pickle é mais lento, mas foi criado para processar estruturas de dados mais complexas e é muito mais flexível, sendo ideal para estruturas de dados maiores ou prioritárias.
Para usar os módulos Marshal e Pickle, importe suas funções escrevendo: import marshal e import pickle. Para nossos propósitos, usaremos as seguintes funções:
marshal.dumps(): Serializa os dados em um formato binário, projetado para velocidade dentro do Python. Recebe um argumento, que é o dado que deseja serializar, e é limitado a tipos de dados básicos.marshal.loads(): Desserializa dados binários para tipos de dados legíveis pelo Python, limitado em suas capacidades, mas com execução rápida. Recebe um argumento, que é o dado a ser desserializado.pickle.DEFAULT_PROTOCOL: Verifica qual versão do protocolo para serialização com Pickle é a padrão na sua versão do Python. Os protocolos afetam como os dados são serializados.pickle.HIGHEST_PROTOCOL: Verifica qual versão do protocolo para serialização com Pickle é a mais alta disponível na sua versão do Python. Os protocolos afetam como os dados são serializados.pickle.dumps(): Serializa estruturas complexas de dados do Python em formato binário de acordo com o protocolo utilizado. Recebe dois argumentos, os dados que deseja serializar e a versão do protocolo que deseja utilizar na serialização.pickle.loads(): Desserializa dados binários para tipos de dados legíveis pelo Python, sendo poderoso para objetos do Python. Recebe um argumento, que é o dado que deseja desserializar.
Além desses módulos e funções, também usaremos um módulo de formatação chamado pformat, que será importado usando from pprint import pformat. Isso nos permitirá usar a função pformat(), que pode ser utilizada para formatar estruturas de dados como dicionários, permitindo exibir as informações de forma clara.
Para começar, dirija-se à marca X com luz dentro da pequena estação de monitoramento e vire-se para o terminal do computador. A estação monitora a pressão da água e as condições do solo do terreno próximo que está sendo desenvolvido para o plantio de culturas. Existe uma constante chamada reading, que contém os dados do Python coletados pela estação.
Crie uma variável chamada data e armazene o valor da função marshal.dumps() definindo reading como argumento. Assim: data = marshal.dumps(reading). Utilize a variável data com a função display() pré-escrita para visualizar os dados serializados da variável.
Saia da estação e dirija-se à marca X dourada; use a função open() para abrir a porta e acessar o escritório. Vá até a marca X com luz em frente ao terminal e desserialize os dados que você acabou de serializar. Crie uma variável chamada output e armazene o valor de marshal.loads() com a variável data anterior como argumento. Utilize a função write() e adicione output como argumento para acessar os dados serializados que você coletou da estação de monitoramento.
Dirija-se à marca X com luz sobre o tapete azul no escritório; no terminal, verificaremos os protocolos para determinar que tipo de serialização o módulo Pickle utilizará ao processar os dados. Na função write() pré-escrita, defina os argumentos como pickle.DEFAULT_PROTOCOL e pickle.HIGHEST_PROTOCOL. Isso verificará qual é o protocolo de serialização atual, bem como o mais recente disponível neste momento.
Siga para a marca X escura sobre o tapete azul; agora que confirmamos os protocolos, podemos verificar os dados armazenados. Dados foram coletados e armazenados ao longo dos meses em uma constante chamada samples. Crie três variáveis chamadas: sereal_0, sereal_2 e sereal_5; usaremos estas para verificar três dos protocolos disponíveis para serialização. O protocolo 0 é em ASCII legível, não muito eficiente, o protocolo 2 é um formato binário mais eficiente e o protocolo 5 é o mais recente, com os recursos mais complexos adicionados.
Armazenaremos o valor de pickle.dumps() e definiremos, como argumentos, a constante samples e o protocol correspondente ao número no nome da variável. Por exemplo, para sereal_0 definiremos o protocol como 0, assim: sereal_0 = pickle.dumps(samples, protocol=0). Use as variáveis sereal_0, sereal_2 e sereal_5 com a função display() pré-escrita para verificar como difere a serialização para cada protocolo.
Vá até a marca X com luz sobre o tapete vermelho e vire-se para o terminal; sobrescreva a variável output e armazene o valor de pickle.loads() definindo o argumento para sereal_5, a fim de desserializar os dados de sample coletados até agora. Use a função display() e adicione a função pformat() com a variável output para visualizar os dados. Assim: await player.display(pformat(output)). Anote as avaliações de cada mês exibidas no terminal para que você possa registrá-las posteriormente.
Dirija-se à marca X escura sobre o tapete vermelho e vire-se para a mesa; na função write() pré-escrita, adicione as avaliações que você anotou de cada mês, que foram exibidas anteriormente no terminal. Adicione-as como strings com aspas "" na ordem correta, conforme delineado na função, para completar o nível.