簡體   English   中英

在python中將namedtuple寫入和讀取到文件中

[英]Writing and reading namedtuple into a file in python

我需要寫存儲為數據結構namedtuple到文件和讀回的namedtuple的蟒蛇。

這里的解決方案建議使用Json.load / loadspickle ,它們以字符串的形式將變量寫為 json 鍵值對。 但是,我所有的字段訪問/取消引用都是struct.key形式(而不是struct["key"]這是訪問 json 值的方式),並且在整個代碼中糾正這一點是不可行的。

我想將它存儲到一個文件中,因為結構很大並且需要很多時間來生成。

由於 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)

    完畢。

您當然可以以任何方式將該 JSON 讀/寫到文件中。 (例如,JSON 模塊具有直接處理文件的方法。)

只要您解決困難酸洗,似乎對pickle.dumps()來,要求工作typename參數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'

我會說這就是扔pickle

我為此編寫了一個庫: https : //github.com/ltworf/typedload

它支持相當復雜的類型,包括枚舉、聯合、元組、集合、列表。

import typedload
typedload.dump(some_namedtuple)

你的namedtuple可能像這樣更復雜

class B(NamedTuple):
    name: str
class A(NamedTuple):
    values: List[Union[str, int]]
    other: Dict[str, str]
    points: Tuple[Tuple[float, float, float], ...]
    more: Optional[B] = None

它可以dump對象,然后將它們load回來。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM