[英]Writing and reading namedtuple into a file in python
我需要寫存儲為數據結構namedtuple
到文件和讀回的namedtuple
的蟒蛇。
這里的解決方案建議使用Json.load
/ loads
或pickle
,它們以字符串的形式將變量寫為 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)
使用_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 模塊具有直接處理文件的方法。)
只要您解決困難酸洗,似乎對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.