🎯 Definicja

Pliki pickle to pliki wykorzystywane w Pythonie do serializacji (zapisu) i deserializacji (odczytu) obiektów — czyli konwersji struktur danych Pythona do formatu bajtowego umożliwiającego ich zapis do pliku i późniejsze odzyskanie w oryginalnej postaci. Format ten oparty jest na wbudowanym module pickle.

🔑 Kluczowe punkty

  • 🔄 Serializacja: konwersja obiektu (np. słownika, listy, modelu ML) do postaci binarnej.
  • 📦 Deserializacja: odtworzenie oryginalnego obiektu z pliku .pkl lub bajtowego strumienia danych.
  • 💾 Umożliwia trwałe zapisywanie obiektów do pliku — np. po treningu modelu ML.
  • ⚠️ Nie jest bezpieczny dla niezaufanych źródeł — może wykonywać złośliwy kod przy ładowaniu.
  • 🐍 Standardowy sposób przechowywania danych i modeli w ekosystemie Pythona i scikit-learn.

📚 Szczegółowe wyjaśnienie

Serializacja – zapis do pliku .pkl

import pickle
 
my_data = {'name': 'Alice', 'age': 30}
 
with open('data.pkl', 'wb') as f:
    pickle.dump(my_data, f)
  • wb – tryb zapisu binarnego.
  • pickle.dump() – zapisuje obiekt do pliku.

Deserializacja – odczyt z pliku .pkl

with open('data.pkl', 'rb') as f:
    loaded_data = pickle.load(f)
 
print(loaded_data)  # {'name': 'Alice', 'age': 30}

Typowe zastosowania

  • Zapisywanie wytrenowanych modeli ML (np. z wykorzystaniem scikit-learn, xgboost)
  • Przechowywanie cache’u danych
  • Serializacja wyszukiwarek (np. wektorowych) lub słowników NLP
  • Transport danych między funkcjami/skryptami bez ponownego przeliczania

💡 Przykład zastosowania: zapis modelu

from sklearn.ensemble import RandomForestClassifier
 
model = RandomForestClassifier().fit(X_train, y_train)
 
with open('model.pkl', 'wb') as f:
    pickle.dump(model, f)
 
# później:
with open('model.pkl', 'rb') as f:
    loaded_model = pickle.load(f)

⚠️ Ostrzeżenie bezpieczeństwa

Pliki pickle mogą zawierać dowolny kod Pythona i wykonywać go po załadowaniu. Nigdy nie używaj pickle.load() na plikach z nieznanych/niesprawdzonych źródeł.

Alternatywy dla bezpieczeństwa i interoperacyjności:

  • joblib – lepsza dla dużych obiektów numerycznych (np. modele sklearn)
  • json – jeśli dane są czysto tekstowe lub liczbowe
  • protobuf, avro, parquet – w środowiskach o wysokich wymaganiach interoperacyjnych i bezpieczeństwa

📌 Źródła

👽 Brudnopis

  • pickle ≠ JSON – obsługuje całą klasę obiektów, w tym modele i klasy niemożliwe do serializacji w JSON
  • Obsługa klas własnych i zagnieżdżeń, ale brak interoperacyjności między językami
  • “rb” / “wb”: read/write binary – ważne!
  • .pkl, .pickle – rozszerzenia standardowe
  • Szybki zapis/odczyt do cache/pomiędzy notatnikami w środowisku ML