导出/导入使用 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 添加一个 children
dan.parent = None
bonny = Node ("Bonny", parent = marc)
Udo
└── Marc
├── Lian
└── Bonny
但是当我将树导出到 json 然后再将其导入回来时,我似乎能够引用的唯一节点是根。所以我不能再做这种修改,因为 dan
或 marc
之类的变量名不存在,即,我找不到引用节点的方法。我错过了什么吗?
with open ('cajon/anytreeexample.json', 'r+', encoding = 'utf-8') as f:
datos = importer.read(f)
print (datos)
这意味着在导入树之后,您所拥有的只是一个根节点
AnyNode(name='Udo') # Udo is the root
从这里你可以得到 Udo 的 children 和 children 的 children like
marc, dan = udo.children
lian = marc.children
jet, jan, joe = dan.children
但他们没有作为节点工作
print (lian.parent)
AttributeError: 'tuple' object has no attribute 'parent'
而且您似乎无法为它们附加 children,这是我使用此结构的主要目的:
sonny = AnyNode("Sonny", parent = lian)
TypeError: __init__() got multiple values for argument 'parent'
所以我的问题是,有没有办法将 json 保存的树加载到适当的任何树结构中,您可以在其中添加新节点?
您实际上做对了:您只是忘记了 ,
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
:
Search for a single node with attribute name having value [...]
所以在用
加载你的树之后
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"))
我用 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
dan.parent = None
bonny = Node ("Bonny", parent = marc)
Udo
└── Marc
├── Lian
└── Bonny
但是当我将树导出到 json 然后再将其导入回来时,我似乎能够引用的唯一节点是根。所以我不能再做这种修改,因为 dan
或 marc
之类的变量名不存在,即,我找不到引用节点的方法。我错过了什么吗?
with open ('cajon/anytreeexample.json', 'r+', encoding = 'utf-8') as f:
datos = importer.read(f)
print (datos)
这意味着在导入树之后,您所拥有的只是一个根节点
AnyNode(name='Udo') # Udo is the root
从这里你可以得到 Udo 的 children 和 children 的 children like
marc, dan = udo.children
lian = marc.children
jet, jan, joe = dan.children
但他们没有作为节点工作
print (lian.parent)
AttributeError: 'tuple' object has no attribute 'parent'
而且您似乎无法为它们附加 children,这是我使用此结构的主要目的:
sonny = AnyNode("Sonny", parent = lian)
TypeError: __init__() got multiple values for argument 'parent'
所以我的问题是,有没有办法将 json 保存的树加载到适当的任何树结构中,您可以在其中添加新节点?
您实际上做对了:您只是忘记了 ,
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
:
Search for a single node with attribute name having value [...]
所以在用
加载你的树之后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"))