繁体   English   中英

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

[英]Exporting / Importing trees created with python anytree 2.4.3 library

我用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

dan.parent = None 
bonny = Node ("Bonny", parent = marc)

Udo
└── Marc
    ├── Lian
    └── Bonny

但是,当我将树导出到json然后再导入回树时,我似乎能够引用的唯一节点是根。 因此,我无法再进行这种修改,因为不存在诸如danmarc类的变量名称,即,我找不到引用节点的方法。 我有什么想念的吗?

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结构中,您可以在其中附加新节点?

您实际上是通过正确的方式完成操作的:您只是忘记了一个,

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')

@如何找到节点:您正在寻找任何树find_by_attr

搜索属性名称具有值[...]的单个节点

所以在加载树后

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

您可以按名称搜索节点:

udo = datos.find_by_attr("Udo") # should be the same as datos if udo was the root

然后像这样添加更多:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM