Com Python pickle, é possível serializar e desserializar objetos. Vários tipos de dados podem ser convertidos, mas, como códigos maliciosos também podem ser armazenados, apenas desserialize arquivos de fontes confiáveis.

O que é o Python pickle?

O módulo Python pickle permite que você salve objetos para usá-los em um momento posterior, assim como compartilhá-los ou utilizá-los em outro projeto. Para isso, os objetos são convertidos em um formato que pode ser armazenado, prática chamada de serialização. Da mesma forma, o Python pickle pode ser usado para desserializar objetos, ou seja, convertê-los de volta ao formato original. Se você pretende usar objetos com mais frequência, o módulo pickle é uma solução eficiente.

O objeto é convertido em um fluxo de bytes, o que mantém todas as informações inalteradas. Com ele você tem a certeza de que o objeto, ao ser convertido de volta ao formato original, poderá ser reutilizado sem problemas. Além disso, o Python pickle fornece instruções para uma desserialização bem-sucedida, permitindo que a estrutura original seja reconstruída em detalhes. Usar o Python pickle economiza tempo, pois objetos criados uma única vez não precisam ser recriados em cada novo uso. O formato de armazenamento mais comum é .pkl.

Quais tipos de dados podem ser convertidos com Python pickle?

O Python pickle pode serializar os seguintes tipos de dados:

  • Valores booleanos: true e false, além de none
  • Números inteiros e complexos
  • Strings (normal e Unicode)
  • Listas
  • Conjuntos
  • Tuplas
  • Dicionários
  • Funções
  • Classes

Quais são os diferentes métodos de Python pickle?

Para trabalhar com Python pickle, você pode fazer uso de um destes quatro métodos:

  • pickle.dump(obj, file, protocol=None, *, fix_imports=True, buffer_callback=None): Realiza uma serialização, criando um arquivo com o resultado desejado.
  • pickle.dumps(obj, protocol=None, *, fix_imports=True, buffer_callback=None): Também usado para serialização, mas retorna uma string de bytes.
  • pickle.load(file, *, fix_imports=True, encoding='ASCII', errors="strict", buffers=None): Usado para desserialização, ele lê o arquivo armazenado.
  • pickle.loads(bytes_object, *, fix_imports=True, encoding="ASCII", errors="strict", buffers=None): Também usado para desserialização, opera com uma string de bytes.

Para distinguir os métodos, lembre-se de que o “s” em pickle.dumps e pickle.loads significa “string”.

Exemplo de uso do módulo Python pickle

Para ilustrar melhor como funciona o Python pickle, usaremos um exemplo simples: uma lista contendo quatro cores. Este é o nosso código:

import pickle
cores = ['Azul', 'Vermelho', 'Amarelo', 'Laranja']
python

Em seguida, abrimos um arquivo de texto no formato .pkl e usamos pickle.dump() para salvar nossa lista nele. Usamos este código para fazer isso:

with open('arquivo_cores.pkl', 'wb') as f:
    pickle.dump(cores, f)
python

O prefixo wb instrui o sistema a abrir o arquivo em formato binário. Assim, os dados contidos também são exibidos como um objeto de bytes. Com dump(), a lista “cores” é então armazenada neste arquivo. Por fim, o arquivo é fechado automaticamente.

Reverter arquivo de armazenamento ao formato original com Python pickle

Para desserializar um arquivo binário, use o método Python pickle.load(). Com o código a seguir, convertemos o objeto de volta ao formato original e iniciamos uma saída. Para isso, adicionamos o prefixo rb.

with open('arquivo_cores.pkl', 'rb') as f:
    cores_desserializadas = pickle.load(f)
    print(cores_desserializadas)
python

Com isso, obtemos a seguinte saída:

['Azul', 'Vermelho', 'Amarelo', 'Laranja']
python

Serializar dicionário com Python pickle

Até mesmo tipos de dados mais complexos, como dicionários, podem ser facilmente serializados com Python pickle e depois revertidos ao formato original. Primeiro, criamos um diretório chamado “pessoas” e nele armazenamos diferentes dados pessoais:

import pickle
 
pessoas = {
    'Pessoa 1': {
        'Nome': "Maria", 'Idade': 56, 'Cidade': "São Paulo"
    },
    'Pessoa 2': {
        'Nome': "Paulo", 'Idade': 66, 'Cidade': "Rio de Janeiro"
    },
    'Pessoa 3': {
        'Nome': "Ana", 'Idade': 22, 'Cidade': "Curitiba"
    },
    'Pessoa 4': {
        'Nome': "Lucas", 'Idade': 34, 'Cidade': "Brasília"
    }
}
python

No código a seguir, criamos um arquivo, serializamos os dados e, em seguida, desserializamos para verificar a integridade da conversão:

with open("pessoas_dict.pkl", "wb") as f:
    pickle.dump(pessoas, f)
with open("pessoas_dict.pkl", "rb") as f:
    dict_desserializado = pickle.load(f)
    print(dict_desserializado)
python

A saída resultante é assim:

pessoas = {
    'Pessoa 1': { 'Nome': "Maria", 'Idade': 56, 'Cidade': "São Paulo"},
    'Pessoa 2': { 'Nome': "Paulo", 'Idade': 66, 'Cidade': "Rio de Janeiro"},
    'Pessoa 3': { 'Nome': "Ana", 'Idade': 22, 'Cidade': "Curitiba"},
    'Pessoa 4': { 'Nome': "Lucas", 'Idade': 34, 'Cidade': "Brasília"}
}
python

Agora, você pode acessar as informações normalmente. Como exemplo, solicitamos a seguinte saída:

# Definir dicionário
dict_desserializado = {
    'Pessoa 1': {'Nome': "Maria", 'Idade': 56, 'Cidade': "São Paulo"},
    'Pessoa 2': {'Nome': "Paulo", 'Idade': 66, 'Cidade': "Rio de Janeiro"},
    'Pessoa 3': {'Nome': "Ana", 'Idade': 22, 'Cidade': "Curitiba"},
    'Pessoa 4': {'Nome': "Lucas", 'Idade': 34, 'Cidade': "Brasília"}
}
 
# Imprimir saída
print(
    "O nome da terceira pessoa é "
    + dict_desserializado["Pessoa 3"]["Nome"]
    + " e ela tem "
    + str(dict_desserializado["Pessoa 3"]["Idade"])
    + " anos."
)
python

Este é o nosso output:

O nome da terceira pessoa é Ana e ela tem 22 anos.
python

Converter classe em string com Python pickle

No próximo exemplo, salvamos uma classe em uma string usando Python pickle. Essa classe contém diferentes tipos de dados, que devem ser todos considerados na conversão. Criamos uma classe chamada “ClasseExemplo” e, em seguida, a serializamos. O código correspondente é:

import pickle
 
class ClasseExemplo:
    def __init__(self):
        self.um_numero = 17
        self.uma_lista = [5, 10, 15]
        self.uma_tupla = (18, 19)
        self.uma_string = "olá"
        self.um_dict = {"cor": "azul", "número": 3}
        
objeto_exemplo = ClasseExemplo()
objeto_serializado = pickle.dumps(objeto_exemplo)
print(f"Este é o objeto serializado:\n{objeto_serializado}\n")
 
objeto_exemplo.um_dict = None
objeto_desserializado = pickle.loads(objeto_serializado)
print(f"Este é o um_dict do objeto desserializado:\n{objeto_desserializado.um_dict}\n")
python

Depois de serializarmos a classe e depois convertê-la de volta ao formato original, obtemos a seguinte saída:

Este é o objeto serializado:
b'\x80\x03c__main__\nClasseExemplo\nq\x00)\x81q\x01.'
Este é o um_dict do objeto desserializado:
{'cor': 'azul', 'número': 3}
python

Comprimir objetos serializados com Python pickle

Embora arquivos serializados com Python pickle podem ser relativamente grandes, especialmente ao armazenar estruturas complexas. Para reduzir o tamanho dos arquivos e otimizar o armazenamento, é possível utilizar compressão adicional, como bzip2, que faz parte da biblioteca padrão dessa linguagem de programação. No exemplo a seguir, criamos uma string, a serializamos e aplicamos o programa de compressão:

import pickle
import bz2
 
string_exemplo = """Quase um paraíso, West Virginia
Montanhas Blue Ridge, Rio Shenandoah
A vida é antiga lá, mais velha que as árvores
Mais jovem que as montanhas, crescendo como uma brisa
Estradas do campo, me leve para casa
Para o lugar ao qual pertenço
West Virginia, mãe das montanhas
Me leve para casa, estradas do campo."""
    
serializado = pickle.dumps(string_exemplo)
comprimido = bz2.compress(serializado)
python

Aviso de segurança ao trabalhar com Python pickle

Embora o Python pickle seja um modo prático e eficaz de converter objetos, há uma desvantagem importante que você deve considerar ao trabalhar com esse módulo: existe a possibilidade do pickle transportar códigos maliciosos por meio de dados serializados. Isso não é um problema em se tratando dos seus próprios dados, mas é preciso cautela ao lidar com arquivos de terceiros. Recomendamos que você desserialize somente arquivos de armazenamento cuja fonte é conhecida e confiável.

Dica

Faça implantações diretamente pelo GitHub: Com o Deploy Now da IONOS, você se beneficia não apenas do reconhecimento automático de frameworks e de configurações rápidas, mas também pode escolher entre diferentes tipos de tarifas. Encontre a solução que se adapta perfeitamente às suas necessidades.

Este artigo foi útil?
Ir para o menu principal