pickle — Сериализация объектов Python
Модуль pickle преобразует любые стандартные объекты Python в поток байтов (сериализация) и обратно (десериализация). Это очень удобно для сохранения настроек, кэша нейросетей или сложных структур данных прямо в файлы.
⚠️ ПРЕДУПРЕЖДЕНИЕ О БЕЗОПАСНОСТИ: Формат pickle небезопасен. Разрешается "распаковывать" только файлы, созданные вами. Злоумышленник может внедрить произвольный код в .pkl файл, и этот код будет выполнен во время чтения. Никогда не читайте pickle-файлы из сети! Для обмена с другими серверами используйте json.
import pickle
Работа с файлами (dump и load)
import pickle
my_data = {
'level': 14,
'inventory': ['Меч', 'Щит', 'Зелье'],
}
# 1. Запись (Консервация)
# Обязательно используйте 'wb' (write binary)
with open('savefile.pkl', 'wb') as file:
pickle.dump(my_data, file)
# 2. Чтение (Распаковка)
# Обязательно используйте 'rb' (read binary)
with open('savefile.pkl', 'rb') as file:
loaded = pickle.load(file)
print(loaded['inventory']) # ['Меч', 'Щит', 'Зелье']
Работа со строками байт (dumps и loads)
Если файл сохранять не нужно, но нужно передать данные по внутренней доверенной сети или сохранить в СУБД:
import pickle
player = ["Воин", 100, 50.5]
# Превратить в байты
byte_stream = pickle.dumps(player)
print(byte_stream) # b'\x80\x04\x95...'
# Прочитать из байт
original = pickle.loads(byte_stream)
Что МОЖНО сериализовать?
- Базовые типы: строки, числа,
None, булевы значения - Коллекции: списки, кортежи, словари, множества
- Самописные классы и их объекты (если их определение есть в коде при импорте)
Что НЕЛЬЗЯ сериализовать?
- Подключения к базам данных и сети
- Открытые файлы
- Генераторы и лямбда-функции
Полный справочник API (API Reference)
Функции сериализации
| Функция | Описание |
|---|---|
pickle.dump(obj, file, protocol=None) |
Конвертирует объект obj в байты и записывает их в открытый бинарный файл file. |
pickle.dumps(obj, protocol=None) |
Возвращает объект в виде чистой строки байтов bytes без записи на диск. |
pickle.load(file) |
Читает бинарный файл file и реконструирует объект Python. |
pickle.loads(bytes_object) |
Читает объект из переменной типа байт bytes. |
Классы Pickler / Unpickler
Предназначены для продвинутого ООП-использования.
| Класс | Описание |
|---|---|
pickle.Pickler(file) |
Принимает бинарный файл, обладает методом .dump(obj). |
pickle.Unpickler(file) |
Обладает методом .load(). |