Что такое pickling

  • "Pickling" - процесс преобразования объекта Python в поток байтов
  • "Unpickling" - обратная операция, в результате которой поток байтов преобразуется обратно в Python-объект
  • Pickle - одна из стандартных библиотек Python, позволяет выполнять сериализацию и десериализацию, работает с потоком байт. Модуль pickle широко применяется для сохранения и загрузки сложных объектов в Python.

Примеры использования

  • Для сохранения данных на внешний файл. Вам нужно создать свой словарь dict ключ-значение, и вы хотите сохранить его на внешнем файле. Так вот pickle может сохранять данные любого типа данных питона на внешний текстовый файл формата bin. Значит, что при последующей загрузке внешнего текстового файла не нужно будет танцевать с бубном вокруг него, чтобы преобразовать его обратно в dict например. Он сразу будет прочитан как dict, родной формат для питона
  • Если правильно понял, то одно из применений это функция сохранений и загрузки в игре, например.

Что можно сериализовать

  • None, True и False
  • числовые типы
  • строковые и байтовые типы
  • кортежи, списки, множества и словари, состоящие только из сериализуемых объектов
  • функции (в том числе встроенные) верхнего уровня, объявленные с def (верхнего уровня = с нулевым отступом)
  • классы верхнего уровня
  • объекты классов, для которых __dict__ или результат __getstate()__ является сериализуемым.

Обратите внимание, что сериализация функций выполняется по имени, а не по значению. Т.е. библиотека сохраняет только имя функции с именем модуля, где она определена. Тоже самое справедливо и для классов

import pickle

obj = [
    {'id':1, 'name':'Stuffy'},
    {'id':2, 'name': 'Fluffy'}
]

with open('file.p', 'wb') as f:
    pickle.dump(obj, f)

with open('file.p', 'rb') as f:
    loaded_obj = pickle.load(f)

print(loaded_obj)
#=> [{'id': 1, 'name': 'Stuffy'}, {'id': 2, 'name': 'Fluffy'}]

Чтобы записать объект в файл нужно использовать метод dump(). Простейший вызов метода выглядит следующим образом

pickle.dump(obj, file, protocol = None, *, fix_imports = True)

где

  • obj – сохраняемый объект. Этим объектом может быть число, строка, список, кортеж, множество, словарь или другой объект;
  • file – бинарный файл, в котором объект может быть сохранен.

Для чтения объекта из файла используется метод load(). В простейшем случае вызов метода load() следующий

obj = pickle.load(file)

здесь obj – объект, получаемый из файла file.

Сравнение с JSON.

Существуют фундаментальные различия между протоколами Pickle и JSON:

  • JSON - это текстовый формат сериализации, а pickle - это двоичный формат сериализации;
  • JSON читается человеком, а pickle - нет;
  • JSON широко используется за пределами экосистемы Python, в то время как Pickle зависит от Python;

Oct. 11, 2023, Источник

Примеры ответов: