Hvad er PKL-filformatet?
En .pkl-fil indeholder et Python-objekt serialiseret ved hjælp af pickle-modulet fra Pythons standardbibliotek. Pickling konverterer næsten enhver Python-datastruktur - dictionaries, lister, klasse-instanser, NumPy-arrays, trænede machine learning-modeller - til en bytestrøm, der kan gemmes på disken og senere gendannes med pickle.load().
Formatet bruger en stakbaseret Pickle Virtual Machine (PVM): en strøm af enkelt-byte opkoder, der, når de eksekveres, rekonstruerer det oprindelige objekt. Protokolversioner spænder fra Protokol 0 (tekstbaserede opkoder, Python 1.2) til Protokol 5 (Python 3.8+, PEP 574, der understøtter out-of-band buffere til store NumPy-arrays). Protokol 4 (magic bytes 80 04 95) er standarden i Python 3.8-3.11. Der er intet fast skema; bytestrømmens struktur bestemmes udelukkende af det objekt, der serialiseres.
Den dominerende moderne brug er lagring af trænede ML-modeller fra scikit-learn, PyTorch (torch.save pakker pickle ind internt) og XGBoost, samt caching af tunge beregningsresultater. joblib-biblioteket (som også bruger pickle) foretrækkes til store NumPy-arrays på grund af understøttelse af memory-mapping.
Sikkerhedsadvarsel: Indlæsning af en .pkl-fil fra en upålidelig kilde kan eksekvere vilkårlig Python-kode. Sikrere alternativer inkluderer .json til simple data, HDF5 eller Parquet til tabulære data, og ONNX eller safetensors til ML-modeller. Filendelserne .pkl og .pickle er fuldt ud udskiftelige.
Sikkerhed og tryghed
RISIKO: HIGHPython Pickle kan eksekvere vilkårlig kode under indlæsning (via __reduce__ / REDUCE-opkode). En ondsindet .pkl-fil er en angrebsvektor for kodeeksekvering - behandl den som en eksekverbar fil. Indlæs kun .pkl-filer fra kilder, du stoler fuldstændigt på. Til deling af ML-modeller bør man foretrække safetensors (HuggingFace) eller ONNX-formatet, som ikke kan eksekvere kode ved indlæsning. Pickle-dokumentationen advarer eksplicit: «The pickle module is not secure.»
Formatdetaljer
kort fortalt- Microsoft Exchange Migration Wizard Packing List - Ældre Microsoft Exchange-migreringsværktøj brugte .pkl til pakkelister; fuldstændig urelateret til Python pickle.
Programmer der åbner PKL-filer
Tekniske detaljer
dyb specifikation| Kodning | Binær opkode-strøm til Pickle Virtual Machine (PVM) |
| Protokol 4 magic bytes | 80 04 95 ved offset 0 (Python 3.4+; standard i Python 3.8-3.11) |
| Protokol 5 magic bytes | 80 05 ved offset 0 (Python 3.8+, PEP 574, understøttelse af out-of-band buffere til NumPy) |
| Protokol 2 magic bytes | 80 02 ved offset 0 (Python 2.3+, understøttelse af new-style klasser, PEP 307) |
| Protokol-rækkevidde | Protokol 0 (tekst-opkoder, 1995) til Protokol 5 (Python 3.8+, 2019) |
| Datastruktur | Flad opkode-strøm med operand-stak og memo-tabel; STOP-opkode (0x2E) markerer slutningen af strømmen |
| Skema | Intet fast skema; strukturen bestemmes udelukkende af det Python-objekt, der serialiseres |
| MIME-type | application/octet-stream (ingen registreret MIME-type) |
| Typisk filstørrelse | 1 KB - adskillige GB (fra små dicts til store ML-modelvægt-tensorer) |
| Sikkerhedsrisiko | Eksekvering af vilkårlig Python-kode er mulig ved pickle.load() fra upålidelige kilder |
| Portabilitet på tværs af sprog | Kun Python; intet andet sprog kan læse eller skrive dette format indfødt |
| Primær moderne brug | Gemme scikit-learn-modeller, PyTorch-vægte (torch.save), XGBoost-modeller, cachede beregninger |
| Udskiftelig filendelse | .pickle er identisk i format og fuldt ud udskiftelig med .pkl |
| Relateret bibliotek | joblib pakker pickle ind med memory-mapping-optimeringer egnet til store NumPy-arrays |
| Udgivet | 1995 (Python 1.2, original pickle module) |
| Seneste version | Protocol 5 (Python 3.8+, PEP 574, 2019) |
| Specifikation | docs.python.org |
Fællesskabets Q&A
spurgt af brugereOfte stillede spørgsmål
Hvordan åbner jeg en .pkl-fil?
import pickle; obj = pickle.load(open('file.pkl', 'rb')). Indlæs kun pkl-filer, du har tillid til - de kan eksekvere kode ved indlæsning.Er en .pkl-fil sikker at åbne?
Hvilket program har oprettet min .pkl-fil?
Kan jeg åbne en .pkl-fil uden Python?
Hvordan konverterer jeg .pkl til JSON eller CSV?
json.dump(obj, open('out.json','w')) for JSON-serialiserbare data, eller pd.DataFrame(obj).to_csv() for tabulære data.