Python保存正确处理str/unicode的序列化方法?
除了PyYAML,还有没有其他安全的Python数据序列化库可以正确处理unicode
和str
类型的数据呢?
举个例子:
>>> json.loads(json.dumps([u"x", "x"]))
[u'x', u'x'] # Both unicode
>>> msgpack.loads(msgpack.dumps([u"x", "x"]))
['x', 'x'] # Neither are unicode
>>> bson.loads(bson.dumps({"x": [u"x", "x"]}))
{u'x': [u'x', 'x']} # Dict keys become unicode
>>> pyamf.decode(pyamf.encode([u"x", "x"])).next()
[u'x', u'x'] # Both are unicode
需要注意的是,我希望这些序列化工具是安全的(所以pickle
和marshel
不行),虽然PyYAML是一个选择,但我不喜欢YAML的复杂性,所以我想知道有没有其他的选择。
编辑:看起来大家对我的数据类型有些误解。有些是Unicode(比如名字),有些是二进制(比如图片)……所以一个把unicode
和str
搞混的序列化库,对我来说和一个把"42"
和42
搞混的库一样没用。
3 个回答
2
我在找跟这个一样的东西,发现msgpack-python 0.4现在支持字符串和Unicode了,可以通过use_bin_type和encoding这两个参数来实现:
>>> msgpack.unpackb(msgpack.packb(["uu\x00u", u"adsa\xe4"], use_bin_type=True, encoding="utf-8"), encoding="utf-8")
['uu\x00u', u'adsa\xe4']
3
也许你可以直接用Python的 repr
来保存这个值,然后用 ast 的 literal_eval
方法来把它转换回来:
In [7]: ast.literal_eval (repr({"d": ["x", u"x"]}))
Out[7]: {'d': ['x', u'x']}