Co to jest format pliku PKL?
Plik .pkl zawiera obiekt Python zserializowany przy użyciu modułu pickle z biblioteki standardowej Python. Proces „pickling” konwertuje niemal każdą strukturę danych Python - słowniki, listy, instancje klas, tablice NumPy, wytrenowane modele uczenia maszynowego - w strumień bajtów, który można zapisać na dysku i później przywrócić za pomocą pickle.load().
Format ten wykorzystuje opartą na stosie maszynę wirtualną Pickle Virtual Machine (PVM): strumień jednobajtowych kodów operacji (opcodes), które po wykonaniu rekonstruują oryginalny obiekt. Wersje protokołów sięgają od Protokołu 0 (opartych na tekście kodów operacji, Python 1.2) do Protokołu 5 (Python 3.8+, PEP 574, obsługujący bufory out-of-band dla dużych tablic NumPy). Protokół 4 (magiczne bajty 80 04 95) jest domyślny w Python 3.8-3.11. Nie istnieje stały schemat; struktura strumienia bajtów jest w całości określona przez serializowany obiekt.
Dominującym współczesnym zastosowaniem jest zapisywanie wytrenowanych modeli ML z bibliotek scikit-learn, PyTorch (torch.save wewnętrznie opakowuje pickle) oraz XGBoost, a także buforowanie kosztownych wyników obliczeń. Biblioteka joblib (która również używa pickle) jest preferowana dla dużych tablic NumPy ze względu na obsługę mapowania pamięci.
Ostrzeżenie dotyczące bezpieczeństwa: ładowanie pliku .pkl z niezaufanego źródła może spowodować wykonanie dowolnego kodu Python. Bezpieczniejsze alternatywy to .json dla prostych danych, HDF5 lub Parquet dla danych tabelarycznych oraz ONNX lub safetensors dla modeli ML. Rozszerzenia .pkl i .pickle są w pełni zamienne.
Bezpieczeństwo
RYZYKO: HIGHPython Pickle może wykonywać dowolny kod podczas ładowania (poprzez kod operacji __reduce__ / REDUCE). Złośliwy plik .pkl jest wektorem ataku typu „code execution” - należy go traktować jak plik wykonywalny. Ładuj pliki .pkl wyłącznie ze źródeł, którym całkowicie ufasz. Do udostępniania modeli ML preferuj formaty safetensors (HuggingFace) lub ONNX, które nie mogą wykonywać kodu przy ładowaniu. Dokumentacja pickle wyraźnie ostrzega: „Moduł pickle nie jest bezpieczny”.
Szczegóły formatu
w pigułce- Microsoft Exchange Migration Wizard Packing List - Starsze narzędzie do migracji Microsoft Exchange używało rozszerzenia .pkl dla list pakowania; całkowicie niezwiązane z Python pickle.
Programy otwierające pliki PKL
Szczegóły techniczne
specyfikacja| Kodowanie | Binarny strumień kodów operacji dla maszyny wirtualnej Pickle Virtual Machine (PVM) |
| Magiczne bajty Protokołu 4 | 80 04 95 pod offsetem 0 (Python 3.4+; domyślny w Python 3.8-3.11) |
| Magiczne bajty Protokołu 5 | 80 05 pod offsetem 0 (Python 3.8+, PEP 574, obsługa buforów out-of-band dla NumPy) |
| Magiczne bajty Protokołu 2 | 80 02 pod offsetem 0 (Python 2.3+, obsługa klas nowego typu, PEP 307) |
| Zakres protokołów | Protokół 0 (tekstowe kody operacji, 1995) do Protokołu 5 (Python 3.8+, 2019) |
| Struktura danych | Płaski strumień kodów operacji ze stosem operandów i tablicą memo; kod operacji STOP (0x2E) oznacza koniec strumienia |
| Schemat | Brak stałego schematu; struktura jest określona całkowicie przez serializowany obiekt Python |
| Typ MIME | application/octet-stream (brak zarejestrowanego typu MIME) |
| Typowy rozmiar pliku | 1 KB - kilka GB (od małych słowników po duże tensory wag modeli ML) |
| Ryzyko bezpieczeństwa | Możliwość wykonania dowolnego kodu Python przy pickle.load() z niezaufanych źródeł |
| Przenośność międzyjęzykowa | Tylko Python; żaden inny język nie potrafi natywnie odczytać ani zapisać tego formatu |
| Główne współczesne zastosowanie | Zapisywanie modeli scikit-learn, wag PyTorch (torch.save), modeli XGBoost, buforowanie obliczeń |
| Zamienne rozszerzenie | .pickle jest identyczny pod względem formatu i w pełni zamienny z .pkl |
| Powiązana biblioteka | joblib opakowuje pickle z optymalizacjami mapowania pamięci dostosowanymi do dużych tablic NumPy |
| Wydano | 1995 (Python 1.2, original pickle module) |
| Najnowsza wersja | Protocol 5 (Python 3.8+, PEP 574, 2019) |
| Specyfikacja | docs.python.org |
Pytania i odpowiedzi społeczności
pytania użytkownikówNajczęściej zadawane pytania
Jak otworzyć plik .pkl?
import pickle; obj = pickle.load(open('file.pkl', 'rb')). Ładuj tylko te pliki pkl, którym ufasz - mogą one wykonywać kod podczas ładowania.Czy plik .pkl jest bezpieczny do otwarcia?
Jaki program utworzył mój plik .pkl?
Czy mogę otworzyć plik .pkl bez Python?
Jak przekonwertować .pkl na JSON lub CSV?
json.dump(obj, open('out.json','w')) dla danych serializowalnych do JSON lub pd.DataFrame(obj).to_csv() dla danych tabelarycznych.