我需要将存储为namedtuple
的数据结构写入文件,并在python中将其作为namedtuple
读回。
这里的解决方案建议使用Json.load
/ loads
或pickle
,它以字符串的形式将变量写为json键值对。但是,我的所有字段访问/解除引用都是struct.key
形式(而不是struct["key"]
这是访问json值的方式),并且在整个代码中纠正这一点是不可行的。
我想将其存储到文件中,因为结构很大并且需要花费大量时间来生成。
答案 0 :(得分:14)
由于Python中的标准JSON模块通常使用dict
来处理JSON对象,因此您需要与dict
进行转换。
要进行一些设置,请说我已经创建了这个namedtuple
:
>>> from collections import namedtuple
>>> import json
>>> X = namedtuple('X', ['x', 'y', 'z'])
>>> x = X(1,2,3)
>>> x
X(x=1, y=2, z=3)
使用_asdict()
转换为可以转储为JSON的dict
:
>>> j = json.dumps(x._asdict())
>>> j
'{"x": 1, "y": 2, "z": 3}'
现在你有一个JSON表示。
要将其恢复为某个对象,请使用**
将dict
转换为关键字参数:
>>> x2 = X(**json.loads(j))
>>> x2
X(x=1, y=2, z=3)
完成。
您当然可以按照您希望的方式将JSON读/写到文件中。 (例如,JSON模块具有直接处理文件的方法。)
答案 1 :(得分:6)
只是解决了你的酸洗困难,似乎要pickle.dumps()
工作,要求typename
的{{1}}参数与返回的类绑定的名称相匹配。
namedtuple
与此比较:
import pickle
from collections import namedtuple
group_t = namedtuple('group_t', 'field1, field2')
Myobj = group_t(field1=1, field2=2)
>>> pickle.dumps(Myobj)
'ccopy_reg\n_reconstructor\np0\n(c__main__\ngroup_t\np1\nc__builtin__\ntuple\np2\n(I1\nI2\ntp3\ntp4\nRp5\n.'
两个类之间的区别是:
mismatched_group_t = namedtuple('group_t', 'field1, field2')
Myobj = mismatched_group_t(field1=1, field2=2)
>>> pickle.dumps(Myobj)
Traceback (most recent call last):
.
.
pickle.PicklingError: Can't pickle <class '__main__.group_t'>: it's not found as __main__.group_t
我说这是>>> group_t.__name__
'group_t'
>>> mismatched_group_t.__name__
'group_t'
关闭的原因。
答案 2 :(得分:0)
我写了一个库来执行此操作:https://github.com/ltworf/typedload
它支持相当复杂的类型,包括枚举,联合,元组,集合。