尝试创建任意树时出现错误“父节点xxx不是'NodeMixin'类型”

2024-06-26 00:24:59 发布

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

关于StackOverflow的第一个问题。我没能找到这个问题的其他例子,这让我相信我做了一些不正确的事情

我正在尝试从物料清单(BOM)数据创建树。首先,我只是想得到基本的父母>;设置子节点

from anytree import Node, RenderTree, find_by_attr, NodeMixin
import pandas as pd

# Create Dataframe from csv file
df1 = pd.read_csv(r'filepath') # filepath only used for example


nodes = {} # Store created nodes

root = Node('root') # Setup root node

# Iterate over df and create parent/child nodes
for index, row in df1.iterrows():
    pitem = row['EBPART'].strip()  # get parent item number
    citem = row['EBCOMP'].strip() # get child item number
    nodes[pitem] = Node(pitem,parent=root) # create child node
    nodes[citem] = Node(citem,parent=pitem) # create parent node

基本上,在迭代过程中,我尝试创建父节点(不会抛出错误),然后使用先前创建的节点作为父节点创建子节点。但是,我不断地犯下这样的错误:

anytree.node.exceptions.TreeError: Parent node 'Product1' is not of type 'NodeMixin'.

以下是rendertree(根)的结果:

print(RenderTree(root))
Node('/root')
└── Node('/root/322601101')

以下是我正在阅读的csv的简化版本:

Sample csv structure

非常感谢您的帮助


Tags: csvfromimportnodechild节点createroot
2条回答

从这个Github Issue看来,您需要在根节点中显式地设置parent=None。而且似乎AnyNode期望**夸尔格。(我没有阅读文档,所以我不能同意)因此您也应该修改您的pitemcitem

下面这行看起来不错:

其中node.name: strnode.parent: Node

nodes[pitem] = Node(pitem,parent=root) # create child node

这个不是:

nodes[citem] = Node(citem,parent=pitem)

这里node.name: str但是node.parent: str,并且应该是Node类型

另外,设置node.parent = None与否完全相同。 与**kwargs的情况相同,这只是可以为节点设置的附加属性,与您面临的错误无关

实际上,您需要首先声明根节点,但您正在这样做,错误并不是因为这个

相关问题 更多 >