Che cos'è il formato di file PKL?
Un file .pkl contiene un oggetto Python serializzato utilizzando il modulo pickle della libreria standard di Python. La serializzazione («pickling») converte quasi ogni struttura dati Python - dizionari, liste, istanze di classi, array NumPy, modelli di machine learning addestrati - in un flusso di byte che può essere salvato su disco e successivamente ripristinato con pickle.load().
Il formato utilizza una Pickle Virtual Machine (PVM) basata su stack: un flusso di opcode a singolo byte che, quando eseguiti, ricostruiscono l'oggetto originale. Le versioni del protocollo vanno dal Protocollo 0 (opcode basati su testo, Python 1.2) al Protocollo 5 (Python 3.8+, PEP 574, che supporta buffer fuori banda per grandi array NumPy). Il Protocollo 4 (magic bytes 80 04 95) è l'impostazione predefinita in Python 3.8-3.11. Non esiste uno schema fisso; la struttura del flusso di byte è interamente determinata dall'oggetto serializzato.
L'uso moderno dominante è il salvataggio di modelli ML addestrati da scikit-learn, PyTorch (torch.save incapsula pickle internamente) e XGBoost, oltre alla memorizzazione nella cache di risultati computazionali onerosi. La libreria joblib (che utilizza anch'essa pickle) è preferita per i grandi array NumPy grazie al supporto per la mappatura della memoria.
Avviso di sicurezza: il caricamento di un file .pkl da una fonte non attendibile può eseguire codice Python arbitrario. Alternative più sicure includono .json per dati semplici, HDF5 o Parquet per dati tabulari, e ONNX o safetensors per i modelli ML. Le estensioni .pkl e .pickle sono completamente intercambiabili.
Sicurezza e incolumità
RISCHIO: HIGHPython Pickle può eseguire codice arbitrario durante il caricamento (tramite l'opcode __reduce__ / REDUCE). Un file .pkl malevolo è un vettore di attacco per l'esecuzione di codice - trattalo come un eseguibile. Carica solo file .pkl da fonti di cui ti fidi completamente. Per la condivisione di modelli ML, preferisci i formati safetensors (HuggingFace) o ONNX che non possono eseguire codice al caricamento. La documentazione di pickle avverte esplicitamente: «Il modulo pickle non è sicuro».
Dettagli del formato
in sintesi- Microsoft Exchange Migration Wizard Packing List - Il vecchio strumento di migrazione di Microsoft Exchange utilizzava .pkl per le liste di imballaggio; completamente non correlato a Python pickle.
Programmi che aprono file PKL
Dettagli tecnici
specifiche approfondite| Codifica | Flusso di opcode binari per la Pickle Virtual Machine (PVM) |
| Magic bytes Protocollo 4 | 80 04 95 all'offset 0 (Python 3.4+; predefinito in Python 3.8-3.11) |
| Magic bytes Protocollo 5 | 80 05 all'offset 0 (Python 3.8+, PEP 574, supporto buffer fuori banda per NumPy) |
| Magic bytes Protocollo 2 | 80 02 all'offset 0 (Python 2.3+, supporto classi new-style, PEP 307) |
| Intervallo protocolli | Dal Protocollo 0 (opcode testuali, 1995) al Protocollo 5 (Python 3.8+, 2019) |
| Struttura dati | Flusso di opcode piatto con stack di operandi e tabella memo; l'opcode STOP (0x2E) segna la fine del flusso |
| Schema | Nessuno schema fisso; la struttura è determinata interamente dall'oggetto Python serializzato |
| Tipo MIME | application/octet-stream (nessun tipo MIME registrato) |
| Dimensione tipica del file | 1 KB - diversi GB (da piccoli dizionari a grandi tensori di pesi per modelli ML) |
| Rischio di sicurezza | Possibile esecuzione di codice Python arbitrario su pickle.load() da fonti non attendibili |
| Portabilità tra linguaggi | Solo Python; nessun altro linguaggio può leggere o scrivere nativamente questo formato |
| Uso moderno primario | Salvataggio modelli scikit-learn, pesi PyTorch (torch.save), modelli XGBoost, calcoli memorizzati in cache |
| Estensione intercambiabile | .pickle è identico nel formato e completamente intercambiabile con .pkl |
| Libreria correlata | joblib incapsula pickle con ottimizzazioni di mappatura della memoria adatte per grandi array NumPy |
| Rilasciato | 1995 (Python 1.2, original pickle module) |
| Ultima versione | Protocol 5 (Python 3.8+, PEP 574, 2019) |
| Specifica | docs.python.org |