Com Python pickle, é possível se­ri­a­li­zar e des­se­ri­a­li­zar objetos. Vários tipos de dados podem ser con­ver­ti­dos, mas, como códigos ma­li­ci­o­sos também podem ser ar­ma­ze­na­dos, apenas des­se­ri­a­lize arquivos de fontes con­fiá­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 com­par­ti­lhá-los ou utilizá-los em outro projeto. Para isso, os objetos são con­ver­ti­dos em um formato que pode ser ar­ma­ze­nado, prática chamada de se­ri­a­li­za­ção. Da mesma forma, o Python pickle pode ser usado para des­se­ri­a­li­zar objetos, ou seja, convertê-los de volta ao formato original. Se você pretende usar objetos com mais frequên­cia, o módulo pickle é uma solução eficiente.

O objeto é con­ver­tido em um fluxo de bytes, o que mantém todas as in­for­ma­ções inal­te­ra­das. Com ele você tem a certeza de que o objeto, ao ser con­ver­tido de volta ao formato original, poderá ser reu­ti­li­zado sem problemas. Além disso, o Python pickle fornece ins­tru­ções para uma des­se­ri­a­li­za­ção bem-sucedida, per­mi­tindo que a estrutura original seja re­cons­truí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 ar­ma­ze­na­mento mais comum é .pkl.

Quais tipos de dados podem ser con­ver­ti­dos com Python pickle?

O Python pickle pode se­ri­a­li­zar 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
  • Di­ci­o­ná­rios
  • Funções
  • Classes

Quais são os di­fe­ren­tes 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 se­ri­a­li­za­ção, criando um arquivo com o resultado desejado.
  • pickle.dumps(obj, protocol=None, *, fix_imports=True, buffer_callback=None): Também usado para se­ri­a­li­za­ção, mas retorna uma string de bytes.
  • pickle.load(file, *, fix_imports=True, encoding='ASCII', errors="strict", buffers=None): Usado para des­se­ri­a­li­za­ção, ele lê o arquivo ar­ma­ze­nado.
  • pickle.loads(bytes_object, *, fix_imports=True, encoding="ASCII", errors="strict", buffers=None): Também usado para des­se­ri­a­li­za­ção, opera com uma string de bytes.

Para dis­tin­guir 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 ar­ma­ze­nada neste arquivo. Por fim, o arquivo é fechado au­to­ma­ti­ca­mente.

Reverter arquivo de ar­ma­ze­na­mento ao formato original com Python pickle

Para des­se­ri­a­li­zar um arquivo binário, use o método Python pickle.load(). Com o código a seguir, con­ver­te­mos o objeto de volta ao formato original e iniciamos uma saída. Para isso, adi­ci­o­na­mos 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

Se­ri­a­li­zar di­ci­o­ná­rio com Python pickle

Até mesmo tipos de dados mais complexos, como di­ci­o­ná­rios, podem ser fa­cil­mente se­ri­a­li­za­dos com Python pickle e depois re­ver­ti­dos ao formato original. Primeiro, criamos um diretório chamado “pessoas” e nele ar­ma­ze­na­mos di­fe­ren­tes 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, se­ri­a­li­za­mos os dados e, em seguida, des­se­ri­a­li­za­mos para verificar a in­te­gri­dade 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 re­sul­tante é 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 in­for­ma­ções nor­mal­mente. Como exemplo, so­li­ci­ta­mos 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 di­fe­ren­tes tipos de dados, que devem ser todos con­si­de­ra­dos na conversão. Criamos uma classe chamada “Clas­se­E­xem­plo” e, em seguida, a se­ri­a­li­za­mos. O código cor­res­pon­dente é:

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 se­ri­a­li­zar­mos 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 se­ri­a­li­za­dos com Python pickle

Embora arquivos se­ri­a­li­za­dos com Python pickle podem ser re­la­ti­va­mente grandes, es­pe­ci­al­mente ao armazenar es­tru­tu­ras complexas. Para reduzir o tamanho dos arquivos e otimizar o ar­ma­ze­na­mento, é possível utilizar com­pres­são adicional, como bzip2, que faz parte da bi­bli­o­teca padrão dessa linguagem de pro­gra­ma­ção. No exemplo a seguir, criamos uma string, a se­ri­a­li­za­mos e aplicamos o programa de com­pres­sã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 des­van­ta­gem im­por­tante que você deve con­si­de­rar ao trabalhar com esse módulo: existe a pos­si­bi­li­dade do pickle trans­por­tar códigos ma­li­ci­o­sos por meio de dados se­ri­a­li­za­dos. Isso não é um problema em se tratando dos seus próprios dados, mas é preciso cautela ao lidar com arquivos de terceiros. Re­co­men­da­mos que você des­se­ri­a­lize somente arquivos de ar­ma­ze­na­mento cuja fonte é conhecida e confiável.

Dica

Faça im­plan­ta­ções di­re­ta­mente pelo GitHub: Com o Deploy Now da IONOS, você se beneficia não apenas do re­co­nhe­ci­mento au­to­má­tico de fra­meworks e de con­fi­gu­ra­ções rápidas, mas também pode escolher entre di­fe­ren­tes tipos de tarifas. Encontre a solução que se adapta per­fei­ta­mente às suas ne­ces­si­da­des.

Ir para o menu principal