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

导出/导入使用python anytree 2.4.3库创建的树,python,tree,python-3.6,anytree,Python,Tree,Python 3.6,Anytree,我用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

我用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,然后再将其导入回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的孩子,孩子们喜欢

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

您实际上做得很对:您只是忘记了一个

@如何查找节点:您正在查找任意树:

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

所以在你的树上加载了

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

你可以参考根、它的子、它的子等等。@Goyo我补充了一些在这个想法之后出现的问题。我想了想,但不知道我将如何去,比如说,一个5级节点,看起来非常复杂,我真的不知道它是否是,但是如果没有硬编码,我将如何做到这一点??什么意思?为了绑定变量,您需要指定value variable=value,没有其他方法。另外,有些似乎不作为节点工作。子项返回元组,而不是节点。而且我似乎也不知道如何添加子对象sonny=NodeSonny,parent=dan怎么样?@Goyo最后一行代码,我以前试过,不起作用,正是因为导出后只得到元组而不是节点。同样,这棵树有6个节点,但我想我会有600个,前两个级别是固定的,然后随着我发现新节点而增加。必须有一种不同的方式,而不是每个节点用node=node Name,parent=parent来实例化它,这就是我硬编码的意思。我的想法是,当我在一个分支中找到属于它的东西时,我可以使用一个函数,在nodeX下附加这个newnode。然后保存它,下次我加载树时,新节点就在那里。子节点总是返回一个节点元组,导出与此无关。为了在nodeX下追加newnode,假设newnode和nodeX都是节点,只需执行newnode.parent=nodeX。是的,问题的根源在于,即使是单个节点也是以元组形式给出的!
Node("Sonny", parent = datos.find_by_attr("lian"))