Python pickle: Como serializar e desserializar objetos
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:
trueefalse, além denone - 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']pythonEm 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)pythonO 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)pythonCom isso, obtemos a seguinte saída:
['Azul', 'Vermelho', 'Amarelo', 'Laranja']pythonSerializar 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"
}
}pythonNo 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)pythonA 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"}
}pythonAgora, 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."
)pythonEste é o nosso output:
O nome da terceira pessoa é Ana e ela tem 22 anos.pythonConverter 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")pythonDepois 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}pythonComprimir 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)pythonAviso 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.
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.

