Wat is het PKL-bestandsformaat?
Een .pkl-bestand bevat een Python-object dat is geserialiseerd met de pickle-module uit de Python-standaardbibliotheek. „Pickling” zet bijna elke Python-datastructuur - dictionaries, lijsten, klasse-instanties, NumPy-arrays, getrainde machine learning-modellen - om in een bytestroom die op schijf kan worden opgeslagen en later kan worden hersteld met pickle.load().
Het formaat maakt gebruik van een op een stack gebaseerde Pickle Virtual Machine (PVM): een stroom van single-byte opcodes die, wanneer ze worden uitgevoerd, het oorspronkelijke object reconstrueren. Protocolversies variëren van Protocol 0 (tekstgebaseerde opcodes, Python 1.2) tot Protocol 5 (Python 3.8+, PEP 574, met ondersteuning voor out-of-band buffers voor grote NumPy-arrays). Protocol 4 (magic bytes 80 04 95) is de standaard in Python 3.8-3.11. Er is geen vast schema; de structuur van de bytestroom wordt volledig bepaald door het object dat wordt geserialiseerd.
Het dominante moderne gebruik is het opslaan van getrainde ML-modellen van scikit-learn, PyTorch (torch.save gebruikt intern pickle) en XGBoost, en het cachen van complexe berekende resultaten. De joblib-bibliotheek (die ook pickle gebruikt) heeft de voorkeur voor grote NumPy-arrays vanwege de ondersteuning voor memory-mapping.
Veiligheidswaarschuwing: het laden van een .pkl-bestand van een onbetrouwbare bron kan willekeurige Python-code uitvoeren. Veiliger alternatieven zijn .json voor eenvoudige gegevens, HDF5 of Parquet voor tabelgegevens, en ONNX of safetensors voor ML-modellen. De extensies .pkl en .pickle zijn volledig uitwisselbaar.
Beveiliging & veiligheid
RISICO: HIGHPython Pickle kan willekeurige code uitvoeren tijdens het laden (via __reduce__ / REDUCE opcode). Een kwaadaardig .pkl-bestand is een vector voor code-executie-aanvallen - behandel het als een uitvoerbaar bestand. Laad alleen .pkl-bestanden van bronnen die u volledig vertrouwt. Voor het delen van ML-modellen verdient safetensors (HuggingFace) of het ONNX-formaat de voorkeur, omdat deze geen code kunnen uitvoeren bij het laden. De pickle-documentatie waarschuwt expliciet: „De pickle-module is niet veilig.”
Formaatdetails
in een notendop- Microsoft Exchange Migration Wizard Packing List - Verouderde Microsoft Exchange-migratietool gebruikte .pkl voor paklijsten; volledig ongerelateerd aan Python pickle.
Programma's die PKL-bestanden openen
Technische details
diepe specificaties| Codering | Binaire opcode-stroom voor de Pickle Virtual Machine (PVM) |
| Protocol 4 magic bytes | 80 04 95 op offset 0 (Python 3.4+; standaard in Python 3.8-3.11) |
| Protocol 5 magic bytes | 80 05 op offset 0 (Python 3.8+, PEP 574, out-of-band bufferondersteuning voor NumPy) |
| Protocol 2 magic bytes | 80 02 op offset 0 (Python 2.3+, ondersteuning voor new-style classes, PEP 307) |
| Protocolbereik | Protocol 0 (tekst-opcodes, 1995) tot Protocol 5 (Python 3.8+, 2019) |
| Datastructuur | Platte opcode-stroom met operand-stack en memo-tabel; STOP-opcode (0x2E) markeert het einde van de stroom |
| Schema | Geen vast schema; de structuur wordt volledig bepaald door het Python-object dat wordt geserialiseerd |
| MIME-type | application/octet-stream (geen geregistreerd MIME-type) |
| Typische bestandsgrootte | 1 KB - diverse GB (van kleine dicts tot grote ML-model weight tensors) |
| Beveiligingsrisico | Willekeurige Python-code-executie mogelijk bij pickle.load() vanuit onbetrouwbare bronnen |
| Portabiliteit tussen talen | Alleen Python; geen enkele andere taal kan dit formaat standaard lezen of schrijven |
| Primair modern gebruik | Opslaan van scikit-learn modellen, PyTorch weights (torch.save), XGBoost-modellen, gecachte berekeningen |
| Uitwisselbare extensie | .pickle is qua formaat identiek en volledig uitwisselbaar met .pkl |
| Gerelateerde bibliotheek | joblib omhult pickle met memory-mapping optimalisaties geschikt voor grote NumPy-arrays |
| Uitgebracht | 1995 (Python 1.2, original pickle module) |
| Laatste versie | Protocol 5 (Python 3.8+, PEP 574, 2019) |
| Specificatie | docs.python.org |