在python中编写和读取namedtuple到一个文件

时间:2015-01-26 10:21:46

标签: python json file-io pickle namedtuple

我需要将存储为namedtuple的数据结构写入文件,并在python中将其作为namedtuple读回。

这里的解决方案建议使用Json.load / loadspickle,它以字符串的形式将变量写为json键值对。但是,我的所有字段访问/解除引用都是struct.key形式(而不是struct["key"]这是访问json值的方式),并且在整个代码中纠正这一点是不可行的。

我想将其存储到文件中,因为结构很大并且需要花费大量时间来生成。

3 个答案:

答案 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)
  1. 使用_asdict()转换为可以转储为JSON的dict

    >>> j = json.dumps(x._asdict())
    >>> j
    '{"x": 1, "y": 2, "z": 3}'
    

    现在你有一个JSON表示。

  2. 要将其恢复为某个对象,请使用**dict转换为关键字参数:

    >>> x2 = X(**json.loads(j))
    >>> x2
    X(x=1, y=2, z=3)
    

    完成。

  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

它支持相当复杂的类型,包括枚举,联合,元组,集合。