O que é o formato de ficheiro PKL?
Um arquivo .pkl contém um objeto Python serializado usando o módulo pickle da biblioteca padrão do Python. O processo de «pickling» converte quase qualquer estrutura de dados Python - dicionários, listas, instâncias de classe, arrays NumPy, modelos de machine learning treinados - em um fluxo de bytes que pode ser salvo no disco e posteriormente restaurado com pickle.load().
O formato utiliza uma Pickle Virtual Machine (PVM) baseada em pilha: um fluxo de opcodes de byte único que, quando executados, reconstroem o objeto original. As versões do protocolo variam do Protocolo 0 (opcodes baseados em texto, Python 1.2) ao Protocolo 5 (Python 3.8+, PEP 574, com suporte a buffers fora de banda para grandes arrays NumPy). O Protocolo 4 (magic bytes 80 04 95) é o padrão no Python 3.8-3.11. Não há um esquema fixo; a estrutura do fluxo de bytes é inteiramente determinada pelo objeto que está sendo serializado.
O uso moderno dominante é salvar modelos de ML treinados do scikit-learn, PyTorch (torch.save envolve o pickle internamente) e XGBoost, além de fazer o cache de resultados computados complexos. A biblioteca joblib (que também usa pickle) é preferida para grandes arrays NumPy devido ao suporte a mapeamento de memória.
Aviso de segurança: carregar um arquivo .pkl de uma fonte não confiável pode executar código Python arbitrário. Alternativas mais seguras incluem .json para dados simples, HDF5 ou Parquet para dados tabulares, e ONNX ou safetensors para modelos de ML. As extensões .pkl e .pickle são totalmente intercambiáveis.
Segurança e proteção
RISCO: HIGHO Python Pickle pode executar código arbitrário durante o carregamento (via __reduce__ / opcode REDUCE). Um arquivo .pkl malicioso é um vetor de ataque de execução de código - trate-o como um executável. Carregue apenas arquivos .pkl de fontes em que você confia plenamente. Para compartilhamento de modelos de ML, prefira safetensors (HuggingFace) ou o formato ONNX, que não podem executar código ao carregar. A documentação do pickle avisa explicitamente: «O módulo pickle não é seguro».
Detalhes do formato
em resumo- Microsoft Exchange Migration Wizard Packing List - Ferramenta legada de migração do Microsoft Exchange usava .pkl para listas de empacotamento; completamente não relacionado ao pickle do Python.
Programas que abrem arquivos PKL
Detalhes técnicos
especificação profunda| Codificação | Fluxo de opcode binário para a Pickle Virtual Machine (PVM) |
| Magic bytes do Protocolo 4 | 80 04 95 no deslocamento 0 (Python 3.4+; padrão no Python 3.8-3.11) |
| Magic bytes do Protocolo 5 | 80 05 no deslocamento 0 (Python 3.8+, PEP 574, suporte a buffer fora de banda para NumPy) |
| Magic bytes do Protocolo 2 | 80 02 no deslocamento 0 (Python 2.3+, suporte a classes de novo estilo, PEP 307) |
| Intervalo de protocolos | Protocolo 0 (opcodes de texto, 1995) até Protocolo 5 (Python 3.8+, 2019) |
| Estrutura de dados | Fluxo de opcode plano com pilha de operandos e tabela de memorização; o opcode STOP (0x2E) marca o fim do fluxo |
| Esquema | Sem esquema fixo; a estrutura é determinada inteiramente pelo objeto Python sendo serializado |
| Tipo MIME | application/octet-stream (nenhum tipo MIME registrado) |
| Tamanho de arquivo típico | 1 KB - vários GB (de pequenos dicionários a grandes tensores de peso de modelos de ML) |
| Risco de segurança | Execução de código Python arbitrário possível no pickle.load() a partir de fontes não confiáveis |
| Portabilidade entre linguagens | Apenas Python; nenhuma outra linguagem pode ler ou gravar nativamente este formato |
| Uso moderno principal | Salvamento de modelos scikit-learn, pesos PyTorch (torch.save), modelos XGBoost, computações em cache |
| Extensão intercambiável | .pickle é idêntico em formato e totalmente intercambiável com .pkl |
| Biblioteca relacionada | joblib envolve o pickle com otimizações de mapeamento de memória adequadas para grandes arrays NumPy |
| Lançado | 1995 (Python 1.2, original pickle module) |
| Versão mais recente | Protocol 5 (Python 3.8+, PEP 574, 2019) |
| Especificação | docs.python.org |