导出/导入使用python anytree 2.4.3库创建的树

2024-04-28 06:30:47 发布

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

我用anytree库创建一棵树。我希望能够对其进行修改,然后将其导出-保存到磁盘,并将其与修改一起导入。例如,示例树:

udo = Node("Udo")
marc = Node("Marc", parent=udo)
lian = Node("Lian", parent=marc)
dan = Node("Dan", parent=udo)
jet = Node("Jet", parent=dan)
jan = Node("Jan", parent=dan)
joe = Node("Joe", parent=dan)

Udo
├── Marc
│   └── Lian
└── Dan
    ├── Jet
    ├── Jan
    └── Joe

我可以修改它,例如切断Dan并在Marc中添加一个children

^{pr2}$

但是,当我将树导出到json,然后将其导入回json时,我似乎只能引用根节点。所以我不能再做这种修改了,因为像dan或{}这样的变量名不存在,也就是说,我找不到引用节点的方法。我有遗漏什么吗?在

with open ('cajon/anytreeexample.json', 'r+', encoding = 'utf-8') as f:
    datos = importer.read(f)

print (datos)

这意味着导入树之后,您所拥有的只是一个根节点

AnyNode(name='Udo')  # Udo is the root

从这里你可以得到乌多的孩子

marc, dan = udo.children
lian = marc.children
jet, jan, joe = dan.children

但它们并不是一个节点

print (lian.parent)
AttributeError: 'tuple' object has no attribute 'parent'

似乎你不能让孩子依附在他们身上,这就是我设计这个结构的主要目的:

sonny = AnyNode("Sonny", parent = lian)
TypeError: __init__() got multiple values for argument 'parent'

所以我的问题是,有没有一种方法可以将json保存的树加载到一个适当的anytree结构中,在那里可以附加新的节点?在


Tags: nodejson节点marcparentchildrendananytree
1条回答
网友
1楼 · 发布于 2024-04-28 06:30:47

实际上你做得对:你只是忘了一个,

from anytree import Node

udo = Node("Udo")
marc = Node("Marc", parent=udo)
Node("Lian", parent=marc)

lian, = marc.children # this is a tupel, even if its only one entry -> add ,
sonny = Node("Sonny", parent = lian)

print (lian.parent)
> Node('/Udo/Marc')

print (sonny)
> Node('/Udo/Marc/Lian/Sonny')

@How to find your nodes:您正在查找anytrees^{}

Search for a single node with attribute name having value [...]

所以在给你的树装上

^{pr2}$

可以按名称搜索节点:

^{3}$

然后再添加更多类似的内容:

Node("Sonny", parent = datos.find_by_attr("lian"))

相关问题 更多 >