CodeGym /Curso Java /Python SELF PT /Trabalhando com pickle

Trabalhando com pickle

Python SELF PT
Nível 22 , Lição 1
Disponível

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 objeto obj e escreve ele em um arquivo aberto file.
    • pickle.load(file): Lê do arquivo file e desserializa o objeto.
  • Ler e escrever objeto em array de bytes
    • pickle.dumps(obj): Serializa o objeto obj 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:

  1. Abrir o arquivo no modo de escrita de bytes (wb).
  2. Serializar o objeto usando pickle.dump(obj, file).
  3. Para desserializar o objeto, usamos pickle.load(file).
  4. 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.

Comentários
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION