Che cos'è il formato di file PICKLE?
I file con l'estensione .pickle memorizzano oggetti Python serializzati utilizzando il modulo pickle, la libreria di serializzazione degli oggetti integrata in Python. Sia .pickle che .pkl sono estensioni intercambiabili per lo stesso formato; .pickle è la forma esplicita più lunga, mentre .pkl è la variante compatta a tre caratteri in uso fin da Python 1.x.
Contenuto dei file Python Pickle
Gli oggetti serializzati nei file .pickle possono essere di qualsiasi tipo Python. I file .pickle vengono utilizzati per serializzare oggetti di database, memorizzare nella cache i pesi dei modelli di machine learning o salvare lo stato del programma tra le esecuzioni. Devono essere utilizzati solo file .pickle provenienti da fonti attendibili, poiché tali file possono contenere software dannoso - la deserializzazione di un pickle non attendibile può eseguire codice Python arbitrario. Gli oggetti Pickle possono essere compressi esternamente utilizzando gzip, bz2 o lzma.
Come vengono creati i file Python PICKLE?
Il processo di serializzazione è chiamato «pickling» e viene eseguito utilizzando i metodi dump() e dumps(). Il metodo dump() viene utilizzato per serializzare un oggetto in un file, mentre dumps() salva l'oggetto come oggetto bytes. La deserializzazione - la conversione del flusso di byte nell'oggetto originale - viene eseguita utilizzando load() e loads(); questo processo è indicato come «unpickling».
La versione del protocollo pickle controlla il formato binario. Il Protocollo 0 è ASCII leggibile dall'uomo; i Protocolli 1-5 sono progressivamente binari, con il Protocollo 5 (Python 3.8+) che aggiunge buffer fuori banda per la gestione efficiente di grandi array .NPY. Nei flussi di lavoro di machine learning, .pickle è ampiamente utilizzato per persistere modelli scikit-learn e checkpoint PyTorch, sebbene SafeTensors stia guadagnando adozione come alternativa più sicura specificamente per i pesi dei modelli.
Sicurezza e incolumità
RISCHIO: HIGHAVVERTENZA CRITICA: I file Pickle possono eseguire codice Python arbitrario quando vengono caricati. Un file .pickle dannoso può eliminare file, scaricare malware o prendere il controllo di un sistema. Non caricare mai un file pickle da una fonte non attendibile. Nei flussi di lavoro ML/AI, i pickle dannosi nei repository di modelli (Hugging Face Hub, GitHub) sono un vettore di minaccia attivo. Usa picklescan per scansionare i file prima del caricamento, o passa al formato SafeTensors per i pesi dei modelli. CVE-2025-1889: picklescan < 0.0.22 poteva essere aggirato utilizzando estensioni di file non standard all'interno di pacchetti di modelli basati su archivio.
Dettagli del formato
in sintesiProgrammi che aprono file PICKLE
import pickle; data = pickle.load(open('file.pickle','rb')); print(data) Dettagli tecnici
specifiche approfondite| Codifica del file | Binario (protocolli 1-5); opcode ASCII leggibili dall'uomo (protocollo 0) |
| Magic bytes | 0x80 seguito dal byte della versione del protocollo; es. 0x80 0x05 per il protocollo 5 (Python 3.8+); il protocollo 0 non ha magic binario |
| Protocolli Pickle | 0 (ASCII, Python 1.x); 1 (binario, Python 1.x); 2 (classi nuovo stile, Python 2.3+); 3 (bytes, Python 3.0+); 4 (oggetti >4 GB, Python 3.4+); 5 (buffer fuori banda, Python 3.8+) |
| Protocollo predefinito | Il protocollo 5 è quello predefinito in Python 3.8 e versioni successive |
| Compressione | Nessuna integrata; comunemente avvolto esternamente in gzip, bz2 o lzma; joblib aggiunge il proprio livello di compressione |
| Crittografia | Nessuna - nessuna crittografia integrata; crittografare a livello di filesystem o wrapper se necessario |
| Dimensione tipica del file | Meno di 1 MB per le configurazioni dei modelli; da 1 MB a diversi GB per i pesi dei modelli ML e i dataset di grandi dimensioni |
| Rischio di sicurezza | La deserializzazione di dati pickle non attendibili può eseguire codice Python arbitrario tramite gli hook __reduce__ - non eseguire mai l'unpickling di file da fonti non attendibili |
| Struttura interna | Flusso di opcode pickle che codificano oggetti Python in modo ricorsivo; il Protocollo 4+ utilizza frame per lo streaming a blocchi; il Protocollo 5 aggiunge buffer fuori banda per lo zero-copy di array di grandi dimensioni |
| Tipo MIME | application/octet-stream (formale); application/x-pickle (informale) |
| Multipiattaforma | Indipendente dalla piattaforma; funziona su qualsiasi sistema operativo supportato da Python (Windows, Linux, macOS) |
| API di serializzazione | dump() e dumps() per il pickling; load() e loads() per l'unpickling |
| Utilizzo ML/AI | Formato di serializzazione primario per i modelli scikit-learn e i checkpoint PyTorch; SafeTensors sta guadagnando adozione come alternativa più sicura per i pesi dei modelli |
| Rilasciato | 1994 (Python 1.1; pickle module first released) |
| Ultima versione | Protocol 5 (Python 3.8, 2019); default protocol 5 from Python 3.14 |
| Standard aperto | Sì · royalty-free |
| Specifica | docs.python.org |
Conversioni PICKLE
Domande e risposte della community
chiesto dagli utentiAncora nessuna domanda - sii il primo a chiedere informazioni sui file PICKLE.
Domande frequenti
Come si apre un file .pickle?
import pickle; data = pickle.load(open('file.pickle', 'rb')). Carica solo file da fonti attendibili - pickle può eseguire codice arbitrario.Qual è la differenza tra .pickle e .pkl?
I file pickle sono sicuri da aprire?
Posso convertire un file pickle in JSON?
json.dump(pickle.load(open('file.pickle','rb')), open('out.json','w')). Gli oggetti complessi (array NumPy, istanze di classi) richiedono serializzatori personalizzati.Quale protocollo Python dovrei usare quando salvo un pickle?
protocol=5 (Python 3.8+) per le migliori prestazioni con dati di grandi dimensioni, specialmente array NumPy. Usa protocol=2 se hai bisogno della compatibilità con Python 2. Specificalo con pickle.dump(obj, f, protocol=5).Perché il mio file pickle è così grande?
pickle.dump(obj, gzip.open('file.pkl.gz','wb')) o passa a SafeTensors/HDF5.Posso aprire un file pickle in Excel o in un foglio di calcolo?
df.to_csv('out.csv').