Was ist das PKL-Dateiformat?
Eine .pkl-Datei enthält ein Python-Objekt, das mit dem pickle-Modul aus der Python-Standardbibliothek serialisiert wurde. Das „Pickling“ konvertiert nahezu jede Python-Datenstruktur - Dictionaries, Listen, Klasseninstanzen, NumPy-Arrays, trainierte Machine-Learning-Modelle - in einen Byte-Stream, der auf der Festplatte gespeichert und später mit pickle.load() wiederhergestellt werden kann.
Das Format verwendet eine stapelbasierte Pickle Virtual Machine (PVM): ein Stream von Ein-Byte-Opcodes, die bei der Ausführung das ursprüngliche Objekt rekonstruieren. Die Protokollversionen reichen von Protokoll 0 (textbasierte Opcodes, Python 1.2) bis Protokoll 5 (Python 3.8+, PEP 574, unterstützt Out-of-Band-Puffer für große NumPy-Arrays). Protokoll 4 (Magic Bytes 80 04 95) ist der Standard in Python 3.8-3.11. Es gibt kein festes Schema; die Struktur des Byte-Streams wird vollständig durch das zu serialisierende Objekt bestimmt.
Die dominierende moderne Verwendung ist das Speichern trainierter ML-Modelle von scikit-learn, PyTorch (torch.save nutzt pickle intern) und XGBoost sowie das Caching aufwendig berechneter Ergebnisse. Die Bibliothek joblib (die ebenfalls pickle verwendet) wird aufgrund der Memory-Mapping-Unterstützung für große NumPy-Arrays bevorzugt.
Sicherheitswarnung: Das Laden einer .pkl-Datei aus einer nicht vertrauenswürdigen Quelle kann beliebigen Python-Code ausführen. Sicherere Alternativen sind .json für einfache Daten, HDF5 oder Parquet für tabellarische Daten sowie ONNX oder safetensors für ML-Modelle. Die Erweiterungen .pkl und .pickle sind vollständig austauschbar.
Sicherheit
RISIKO: HIGHPython Pickle kann beim Laden beliebigen Code ausführen (über __reduce__ / REDUCE-Opcode). Eine bösartige .pkl-Datei ist ein Angriffsvektor für Code-Ausführung - behandeln Sie diese wie eine ausführbare Datei. Laden Sie .pkl-Dateien nur von Quellen, denen Sie vollständig vertrauen. Für den Austausch von ML-Modellen bevorzugen Sie safetensors (HuggingFace) oder das ONNX-Format, die beim Laden keinen Code ausführen können. Die pickle-Dokumentation warnt ausdrücklich: „Das pickle-Modul ist nicht sicher.“
Formatdetails
kurz gefasst- Microsoft Exchange Migration Wizard Packing List - Das veraltete Microsoft Exchange Migrationstool verwendete .pkl für Packlisten; steht in keinem Zusammenhang mit Python pickle.
Programme zum Öffnen von PKL-Dateien
Technische Details
technische Spezifikation| Kodierung | Binärer Opcode-Stream für die Pickle Virtual Machine (PVM) |
| Protokoll 4 Magic Bytes | 80 04 95 bei Offset 0 (Python 3.4+; Standard in Python 3.8-3.11) |
| Protokoll 5 Magic Bytes | 80 05 bei Offset 0 (Python 3.8+, PEP 574, Out-of-Band-Puffer-Unterstützung für NumPy) |
| Protokoll 2 Magic Bytes | 80 02 bei Offset 0 (Python 2.3+, Unterstützung für New-Style-Klassen, PEP 307) |
| Protokoll-Bereich | Protokoll 0 (Text-Opcodes, 1995) bis Protokoll 5 (Python 3.8+, 2019) |
| Datenstruktur | Flacher Opcode-Stream mit Operanden-Stack und Memo-Tabelle; STOP-Opcode (0x2E) markiert das Stream-Ende |
| Schema | Kein festes Schema; die Struktur wird vollständig durch das serialisierte Python-Objekt bestimmt |
| MIME-Typ | application/octet-stream (kein registrierter MIME-Typ) |
| Typische Dateigröße | 1 KB - mehrere GB (von kleinen Dicts bis hin zu großen ML-Modell-Gewichtstensoren) |
| Sicherheitsrisiko | Ausführung von beliebigem Python-Code bei pickle.load() aus nicht vertrauenswürdigen Quellen möglich |
| Plattformübergreifende Portabilität | Nur Python; keine andere Sprache kann dieses Format nativ lesen oder schreiben |
| Primäre moderne Verwendung | Speichern von scikit-learn-Modellen, PyTorch-Gewichten (torch.save), XGBoost-Modellen, zwischengespeicherten Berechnungen |
| Austauschbare Erweiterung | .pickle ist formatidentisch und vollständig austauschbar mit .pkl |
| Zugehörige Bibliothek | joblib erweitert pickle um Memory-Mapping-Optimierungen, die für große NumPy-Arrays geeignet sind |
| Veröffentlicht | 1995 (Python 1.2, original pickle module) |
| Neueste Version | Protocol 5 (Python 3.8+, PEP 574, 2019) |
| Spezifikation | docs.python.org |