9.1 Introdução ao pickle
O módulo pickle
permite salvar praticamente qualquer
objeto Python em um arquivo ou string, e depois restaurá-lo ao seu estado
original. pickle
suporta muitos tipos de dados, incluindo
objetos de classes personalizadas, e automatiza o processo
de conversão de objetos para o formato de bytes e vice-versa.
Principais funções do módulo pickle
-
Ler e escrever objeto em arquivo
-
pickle.dump(obj, file)
: Serializa o objetoobj
e escreve ele em um arquivo abertofile
. -
pickle.load(file)
: Lê do arquivofile
e desserializa o objeto.
-
-
Ler e escrever objeto em array de bytes
-
pickle.dumps(obj)
: Serializa o objetoobj
e retorna ele como objeto de bytes. -
pickle.loads(bytes)
: Desserializa o objeto de um objeto de bytes.
-
Vamos dar uma olhada neles um pouco mais de perto:
9.2 Serialização em arquivo
Principais passos para serializar em um arquivo:
-
Abrir o arquivo no modo de escrita de bytes
(wb)
. -
Serializar o objeto usando
pickle.dump(obj, file)
. -
Para desserializar o objeto, usamos
pickle.load(file)
. - Fechar o arquivo.
Serialização e desserialização de objeto em arquivo
Para o pickle
, tanto faz o que vai serializar. Por exemplo, é assim que se parece a serialização de uma lista:
import pickle
data = [1, 2, 3, 4, 5]
# Serialização da lista em arquivo
with open('list.pkl', 'wb') as file:
pickle.dump(data, file)
# Desserialização da lista do arquivo
with open('list.pkl', 'rb') as file:
loaded_data = pickle.load(file)
print(loaded_data) # Saída: [1, 2, 3, 4, 5]
E é assim que se parece a serialização de um objeto dicionário:
import pickle
# Exemplo de objeto para serialização
data = {'name': 'Alice', 'age': 30, 'is_student': False}
# Serialização do objeto em arquivo
with open('data.pkl', 'wb') as file:
pickle.dump(data, file)
# Desserialização do objeto do arquivo
with open('data.pkl', 'rb') as file:
loaded_data = pickle.load(file)
print(loaded_data) # Saída: {'name': 'Alice', 'age': 30, 'is_student': False}
Queremos salvar o objeto — chamamos
dump()
, queremos carregar — chamamos
load()
. Nada complicado.
9.3 Serialização em string
Muitas vezes os objetos precisam ser enviados pela rede, portanto o objeto precisa
ser salvo não em arquivo, mas em string. Para isso, o pickle
tem os métodos
dumps
e loads
com um
s
adicional no final.
Principais ações para serialização e desserialização em string (ou array de bytes):
-
Serializar o objeto usando
pickle.dumps(obj)
. -
Para desserializar o objeto, usamos
pickle.loads(data)
.
Serialização e desserialização de objeto em string
Serializar um objeto em string (ou conjunto de bytes) é ainda mais simples — você precisa
chamar um método apenas — dumps()
.
Exemplo:
import pickle
# Exemplo de objeto para serialização
data = {'name': 'Bob', 'age': 25, 'is_student': True}
# Serialização do objeto em string
serialized_data = pickle.dumps(data)
print(serialized_data)
# Desserialização do objeto da string
loaded_data = pickle.loads(serialized_data)
print(loaded_data) # Saída: {'name': 'Bob', 'age': 25, 'is_student': True}
9.4 Erros na serialização
Às vezes, ocorrem erros durante a serialização. Nesse caso, o módulo
pickle
vai lançar exceções:
-
pickle.PicklingError
— erro durante a serialização. -
pickle.UnpicklingError
— erro durante a desserialização.
Exemplos:
import pickle
data = {'key': 'value'}
try:
# Serialização do objeto em arquivo
with open('data.pkl', 'wb') as file:
pickle.dump(data, file)
except pickle.PicklingError as e:
print(f"Erro de serialização: {e}")
try:
# Desserialização do objeto do arquivo
with open('data.pkl', 'rb') as file:
loaded_data = pickle.load(file)
print(loaded_data)
except pickle.UnpicklingError as e:
print(f"Erro de desserialização: {e}")
Normalmente, você como programador não pode fazer nada com um erro de serialização/desserialização durante a execução do programa. Tudo o que você pode fazer — é salvar no log, para no futuro entender por que aconteceu.
A principal razão desses erros — é a mudança no formato do objeto. Você salvou o objeto em um arquivo, depois o seu programa foi atualizado, e o objeto ganhou novos campos ou os antigos desapareceram. E aí um objeto antigo salvo tenta ser carregado em uma classe de um novo objeto...
Novamente, essa situação é comum ao trabalhar com rede — o programa na versão 2.18 envia um objeto um pouco diferente do que espera o programa na versão 3.1. Isso é chamado de problema de migração, e programas de longa vida e populares frequentemente se deparam com isso.
GO TO FULL VERSION