# 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](https://www.ionos.com/pt-br/digitalguide/sites-de-internet/desenvolvimento-web/python-data-types/):

- Valores booleanos: `true` e `false`, além de `none`
- Números inteiros e complexos
- Strings (normal e Unicode)
- Listas
- Conjuntos
- [Tuplas](https://www.ionos.com/pt-br/digitalguide/sites-de-internet/desenvolvimento-web/python-tuples/ "Tuplas Python")
- Dicionários
- Funções
- [Classes](https://www.ionos.com/pt-br/digitalguide/sites-de-internet/desenvolvimento-web/python-classes/ "Classes Python")

## 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:

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

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:

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

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`.

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

Com isso, obtemos a seguinte saída:

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

## 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:

```python
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"
    }
}
```

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

```python
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)
```

A saída resultante é assim:

```python
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"}
}
```

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

```python
# 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."
)
```

Este é o nosso output:

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

## 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 é:

```python
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")
```

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

```python
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}
```

## 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:

```python
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)
```

## 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](https://www.ionos.com/hosting/deploy-now "Deploy Now - IONOS") 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.


This is a markdown version of: [https://www.ionos.com/pt-br/digitalguide/sites-de-internet/desenvolvimento-web/python-pickle/](https://www.ionos.com/pt-br/digitalguide/sites-de-internet/desenvolvimento-web/python-pickle/) for AI/LLM consumption.