如何将Python字典序列化为字符串,然后再反序列化回字典?

86 投票
9 回答
160396 浏览
提问于 2025-04-16 07:58

我想知道怎么把一个Python字典变成字符串,然后再把它变回字典。这个字典里面可能还会有列表和其他字典。

9 个回答

13

使用Python的 json 模块,如果你的Python版本低于2.6,可以用 simplejson

17

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_eval不支持的类型,你就得换用其他方法,比如使用Pickle。

135

这要看你想用它来做什么。如果你只是想保存数据,可以使用 pickle(如果你在用 CPython 2.x,那就用 cPickle,它会更快)。

>>> import pickle
>>> pickle.dumps({'foo': 'bar'})
b'\x80\x03}q\x00X\x03\x00\x00\x00fooq\x01X\x03\x00\x00\x00barq\x02s.'
>>> pickle.loads(_)
{'foo': 'bar'}

如果你希望保存的数据是可读的,可以使用 json

>>> import json
>>> json.dumps({'foo': 'bar'})
'{"foo": "bar"}'
>>> json.loads(_)
{'foo': 'bar'}

不过,json 支持的内容非常有限,而 pickle 可以用来处理各种对象(如果自动处理不成功,类可以定义 __getstate__ 来精确指定如何保存)。

>>> pickle.dumps(object())
b'\x80\x03cbuiltins\nobject\nq\x00)\x81q\x01.'
>>> json.dumps(object())
Traceback (most recent call last):
  ...
TypeError: <object object at 0x7fa0348230c0> is not JSON serializable

撰写回答