Pickle великолепен, но я думаю, что стоит упомянуть literal_eval
из модуля ast
для еще более легкого решения, если вы только сериализуете базовые типы Python. По сути, это «безопасная» версия пресловутой функции eval
, которая позволяет оценивать только базовые типы Python, в отличие от любого допустимого кода Python.
Пример:
>>> d = {}
>>> d[0] = range(10)
>>> d['1'] = {}
>>> d['1'][0] = range(10)
>>> d['1'][1] = 'hello'
>>> data_string = str(d)
>>> print data_string
{0: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], '1': {0: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], 1: 'hello'}}
>>> from ast import literal_eval
>>> d == literal_eval(data_string)
True
Одним из преимуществ является то, что сериализованные данные - это просто код Python, поэтому они очень удобны для человека. Сравните это с тем, что вы получите с pickle.dumps
:
>>> import pickle
>>> print pickle.dumps(d)
(dp0
I0
(lp1
I0
aI1
aI2
aI3
aI4
aI5
aI6
aI7
aI8
aI9
asS'1'
p2
(dp3
I0
(lp4
I0
aI1
aI2
aI3
aI4
aI5
aI6
aI7
aI8
aI9
asI1
S'hello'
p5
ss.
Недостатком является то, что как только данные включают в себя тип, который не поддерживается literal_ast
, вам придется переходить к чему-то другому, например, к травлению.