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

2024-05-15 20:39:27 发布

您现在位置:Python中文网/ 问答频道 /正文

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

请注意,我希望序列化程序是安全的(因此picklemarshel都不存在),PyYAML是一个选项,但是我不喜欢YAML的复杂性,所以我想知道是否还有其他选项。在

编辑:我的数据的性质似乎有些混乱。其中有些是Unicode(例如,名称),有些是二进制(例如,图像)…因此,混淆unicode和{}的序列化库对我来说就像混淆"42"和{}的库一样无用。在


Tags: 数据json序列化选项unicodemsgpackarepyyaml
3条回答

你试过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,因为this outstanding pull request

也许只需使用Python的repr来存储该值并使用ast.literal_eval方法反序列化它:

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

寻找同样的东西,我发现msgpack python0.4现在支持str/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']

相关问题 更多 >