Сериализация с помощью pickle
Сохранение структур данных в файл называется сериализацией. Форматы вроде JSON могут требовать наличия пользовательских преобразователей для сериализации всех типов данных программы, написанной на Python. Python предоставляет модуль pickle, позволяющий сохранить и восстановить любой объект в специальном бинарном формате.
Помните, как JSON сошел с ума, когда встретил объект datetime? Для pickle это не проблема:
>>>> import pickle
>>>> import datetime
>>>> now1 = datetime.datetime.utcnow()
>>>> pickled = pickle.dumps(now1)
>>>> now2 = pickle.loads(pickled)
>>>> now1
>datetime.datetime(2014, 6, 22, 23, 24, 19, 195722)
>>>> now2
>datetime.datetime(2014, 6, 22, 23, 24, 19, 195722)
pickle работает также с вашими собственными классами и объектами. Мы определим небольшой класс, который называется Tiny и возвращает слово 'tiny', когда он используется как строка:
>>>> import pickle
>>>> class Tiny():
>…·····def __str__(self):
>…········return 'tiny'
>…
>>>> obj1 = Tiny()
>>>> obj1
><__main__.Tiny object at 0x10076ed10>
>>>> str(obj1)
>'tiny'
>>>> pickled = pickle.dumps(obj1)
>>>> pickled
>b'\x80\x03c__main__\nTiny\nq\x00)\x81q\x01.'
>>>> obj2 = pickle.loads(pickled)
>>>> obj2
><__main__.Tiny object at 0x10076e550>
>>>> str(obj2)
>'tiny'
pickled — это обработанная pickle бинарная строка, созданная из объекта obj1. Мы преобразовали ее в объект obj2, чтобы сделать копию объекта obj1. Используйте функцию dump(), чтобы pickle сохранил данные в файл, и функцию load(), чтобы pickle загрузил данные из файла.
Поскольку pickle может создавать объекты Python, к нему применимы предупреждения о безопасности, которые были рассмотрены ранее. Не загружайте в pickle данные, которым не доверяете.