Python保存正确处理str/unicode的序列化方法?

5 投票
3 回答
1521 浏览
提问于 2025-04-16 23:11

除了PyYAML,还有没有其他安全的Python数据序列化库可以正确处理unicodestr类型的数据呢?

举个例子:

>>> 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

需要注意的是,我希望这些序列化工具是安全的(所以picklemarshel不行),虽然PyYAML是一个选择,但我不喜欢YAML的复杂性,所以我想知道有没有其他的选择。

编辑:看起来大家对我的数据类型有些误解。有些是Unicode(比如名字),有些是二进制(比如图片)……所以一个把unicodestr搞混的序列化库,对我来说和一个把"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 来保存这个值,然后用 astliteral_eval 方法来把它转换回来:

In [7]: ast.literal_eval (repr({"d": ["x", u"x"]}))
Out[7]: {'d': ['x', u'x']}
1

你试过 bert 吗?

>>> import bert
>>> bert.decode(bert.encode([u"x", "x"]))
[u'x', 'x']
>>> bert.decode(bert.encode({"x":[u"x", "x"]}))
{'x': [u'x', 'x']}

(要安装这个,你需要先手动安装 erlastic,因为有一个 很棒的更新请求

撰写回答