Curso Avançado de Desenvolvimento em 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 estejam devidamente armazenados usando o módulo JSON para formatar os arquivos.
Continuando pelo caminho, encontramos algumas estações que monitoram a distribuição de água e a qualidade do solo para as terras que estão sendo desenvolvidas para uma futura colheita. Para processar os dados, é eficiente serializá-los. Embora usar JSON possa ser uma solução geral eficaz, também há alguns métodos de serialização específicos do Python, que são os módulos Marshal e Pickle. O módulo Marshal foi projetado para serialização/deserialização rápida, convertendo os dados em binário, ideal para transferências de dados mais simples. O módulo Pickle é mais lento, mas foi projetado para processar estruturas de dados mais complexas e é muito mais flexível, 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 dados em um formato binário, projetado para velocidade dentro do Python. Recebe um argumento, que é o dado que você deseja serializar, e é limitado a tipos de dados básicos.marshal.loads(): Desserializa dados binários em 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 de protocolo de serialização do Pickle é padrão em sua versão do Python. Os protocolos afetam como os dados são serializados.pickle.HIGHEST_PROTOCOL: Verifica qual versão de protocolo de serialização do Pickle é a mais alta disponível em sua versão do Python. Os protocolos afetam como os dados são serializados.pickle.dumps(): Serializa estruturas de dados complexas do Python em formato binário de acordo com o protocolo usado. Recebe dois argumentos, o dado que você deseja serializar e a versão do protocolo que deseja usar ao serializar.pickle.loads(): Desserializa dados binários em tipos de dados legíveis pelo Python, poderoso em escopo para objetos do Python. Recebe um argumento, que é o dado que você deseja desserializar.
Além desses módulos e funções, também usaremos um módulo de formatação chamado pformat, que importaremos usando from pprint import pformat. Isso nos permite usar a função pformat(), que pode ser usada para formatar estruturas de dados como dicionários, permitindo exibir as informações de forma clara.
Para começar, ande até a marcação X clara dentro da pequena estação de monitoramento e fique de frente 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. Há uma constante chamada reading, que contém dados em 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). Use a variável data com a função pré-escrita display() para visualizar os dados serializados.
Saia da estação e dirija-se à marcação X dourada, use a função open() para abrir a porta e acessar o escritório. Dirija-se à marcação X clara 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. Use a função write() e adicione output como argumento para acessar os dados serializados que você coletou na estação de monitoramento.
Ande até a marcação X clara sobre o carpete azul no escritório; no terminal, verificaremos os protocolos para determinar qual tipo de serialização o módulo pickle usará ao processar os dados. Na função pré-escrita write(), defina os argumentos como pickle.DEFAULT_PROTOCOL e pickle.HIGHEST_PROTOCOL. Isso verificará qual é o protocolo de serialização padrão, bem como o mais recente disponível.
Agora vá até a marcação X escura sobre o carpete azul; agora que confirmamos os protocolos, podemos verificar os dados armazenados. Os 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 essas variáveis para verificar três dos protocolos disponíveis para serialização. O protocolo 0 é 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 sereal_0, sereal_2 e sereal_5 com a função pré-escrita display() para verificar como a serialização difere em cada protocolo.
Ande até a marcação X clara sobre o carpete vermelho e fique de frente para o terminal, sobrescreva a variável output e armazene o valor de pickle.loads(), definindo o argumento como sereal_5 para desserializar os dados de amostra coletados até agora. Use a função display() e inclua a função pformat() com a variável output para visualizar os dados. Assim: await player.display(pformat(output)). Anote as classificações de cada mês exibidas no terminal para que você possa registrá-las mais tarde.
Ande até a marcação X escura sobre o carpete vermelho e fique de frente para a mesa; na função pré-escrita write(), adicione as classificações que você anotou para cada mês, que foram exibidas anteriormente no terminal. Adicione-as como strings com aspas "" na ordem correta conforme estão delineadas na função, para completar o nível.