Что такое формат файла PKL?
Файл .pkl содержит объект Python, сериализованный с использованием модуля pickle из стандартной библиотеки Python. Процесс «пиклизации» (pickling) преобразует практически любую структуру данных Python - словари, списки, экземпляры классов, массивы NumPy, обученные модели машинного обучения - в поток байтов, который можно сохранить на диск и позже восстановить с помощью pickle.load().
Формат использует стековую виртуальную машину Pickle (PVM): поток однобайтовых кодов операций (опкодов), которые при выполнении воссоздают исходный объект. Версии протокола варьируются от Protocol 0 (текстовые опкоды, Python 1.2) до Protocol 5 (Python 3.8+, PEP 574, поддержка внешних буферов для больших массивов NumPy). Protocol 4 (магические байты 80 04 95) является стандартом по умолчанию в Python 3.8-3.11. Фиксированной схемы данных не существует; структура потока байтов полностью определяется сериализуемым объектом.
Основное современное применение - сохранение обученных моделей ML из scikit-learn, PyTorch (torch.save использует pickle внутри) и XGBoost, а также кэширование ресурсоемких вычислений. Библиотека joblib (которая также использует pickle) предпочтительна для больших массивов NumPy благодаря поддержке отображения памяти (memory-mapping).
Предупреждение о безопасности: загрузка файла .pkl из ненадежного источника может привести к выполнению произвольного кода Python. Более безопасные альтернативы включают .json для простых данных, HDF5 или Parquet для табличных данных, а также ONNX или safetensors для моделей ML. Расширения .pkl и .pickle полностью взаимозаменяемы.
Безопасность и защита
РИСК: HIGHPython Pickle может выполнять произвольный код во время загрузки (через метод __reduce__ / опкод REDUCE). Вредоносный файл .pkl является вектором атаки для выполнения кода - относитесь к нему как к исполняемому файлу. Загружайте файлы .pkl только из источников, которым вы полностью доверяете. Для обмена моделями ML отдавайте предпочтение форматам safetensors (HuggingFace) или ONNX, которые не могут выполнять код при загрузке. Документация pickle прямо предупреждает: «Модуль pickle не является безопасным».
Детали формата
в двух словах- Microsoft Exchange Migration Wizard Packing List - Устаревший инструмент миграции Microsoft Exchange использовал .pkl для списков упаковки; совершенно не связан с Python pickle.
Программы, открывающие файлы PKL
import pickle; obj = pickle.load(open('file.pkl', 'rb')), затем изучите объект obj. pickle.load() для просмотра содержимого. pickle.load() в консоли IPython. import pickle; obj = pickle.load(open('file.pkl', 'rb')), затем изучите объект obj. import pickle; obj = pickle.load(open('file.pkl', 'rb')), затем изучите объект obj. Технические подробности
глубокая спецификация| Кодировка | Бинарный поток кодов операций для виртуальной машины Pickle (PVM) |
| Магические байты Protocol 4 | 80 04 95 по смещению 0 (Python 3.4+; по умолчанию в Python 3.8-3.11) |
| Магические байты Protocol 5 | 80 05 по смещению 0 (Python 3.8+, PEP 574, поддержка внешних буферов для NumPy) |
| Магические байты Protocol 2 | 80 02 по смещению 0 (Python 2.3+, поддержка классов нового стиля, PEP 307) |
| Диапазон протоколов | От Protocol 0 (текстовые опкоды, 1995) до Protocol 5 (Python 3.8+, 2019) |
| Структура данных | Плоский поток опкодов со стеком операндов и таблицей мемоизации; опкод STOP (0x2E) отмечает конец потока |
| Схема | Нет фиксированной схемы; структура полностью определяется сериализуемым объектом Python |
| MIME-тип | application/octet-stream (нет зарегистрированного MIME-типа) |
| Типичный размер файла | От 1 КБ до нескольких ГБ (от небольших словарей до огромных тензоров весов моделей ML) |
| Риск безопасности | Возможно выполнение произвольного кода Python при вызове pickle.load() из ненадежных источников |
| Межъязыковая переносимость | Только для Python; другие языки не могут нативно читать или записывать этот формат |
| Основное современное использование | Сохранение моделей scikit-learn, весов PyTorch (torch.save), моделей XGBoost, кэширование вычислений |
| Взаимозаменяемое расширение | .pickle идентичен по формату и полностью взаимозаменяем с .pkl |
| Связанная библиотека | joblib расширяет pickle оптимизациями отображения памяти, подходящими для больших массивов NumPy |
| Выпущен | 1995 (Python 1.2, original pickle module) |
| Последняя версия | Protocol 5 (Python 3.8+, PEP 574, 2019) |
| Спецификация | docs.python.org |
Вопросы и ответы сообщества
спрошено пользователямиЧасто задаваемые вопросы
Как открыть файл .pkl?
import pickle; obj = pickle.load(open('file.pkl', 'rb')). Загружайте только те файлы pkl, которым вы доверяете - они могут выполнять код при загрузке.Безопасно ли открывать файл .pkl?
Какая программа создала мой файл .pkl?
Можно ли открыть файл .pkl без Python?
Как конвертировать .pkl в JSON или CSV?
json.dump(obj, open('out.json','w')) для данных, поддерживающих JSON, или pd.DataFrame(obj).to_csv() для табличных данных.