【问题标题】:Read data from a file and create a tree using anytree in python从文件中读取数据并使用 python 中的 anytree 创建树
【发布时间】:2018-08-17 20:09:42
【问题描述】:

有没有办法从文件中读取数据并使用anytree构造一棵树?

Parent Child
A      A1
A      A2
A2     A21

我可以使用静态值来做到这一点,如下所示。但是,我想通过使用 anytree 从文件中读取数据来自动执行此操作。

>>> from anytree import Node, RenderTree
>>> A = Node("A")
>>> A1 = Node("A1", parent=A)
>>> A2 = Node("A2", parent=A)
>>> A21 = Node("A21", parent=A2)

输出是

A
├── A1
└── A2
    └── A21

【问题讨论】:

    标签: python file tree anytree


    【解决方案1】:

    这假定条目的顺序是始终事先将父节点作为另一个节点的子节点引入(不包括根节点)。

    考虑到这一点,我们可以遍历这些行,拆分它们(我使用了split,正则表达式也可以)并创建新节点。

    对于如何通过名称获取对父级的引用,我想出了两个解决方案:

    首先,使用anytrees find_by_attr按名称查找父级

    from anytree import Node, RenderTree, find_by_attr
    
    with open('input.txt', 'r') as f:
        lines = f.readlines()[1:]
        root = Node(lines[0].split(" ")[0])
    
        for line in lines:
            line = line.split(" ")
            Node("".join(line[1:]).strip(), parent=find_by_attr(root, line[0]))
    
        for pre, _, node in RenderTree(root):
            print("%s%s" % (pre, node.name))
    

    其次,在我们创建它们的同时将它们缓存在字典中:

    from anytree import Node, RenderTree, find_by_attr
    
    with open('input.txt', 'r') as f:
        lines = f.readlines()[1:]
        root = Node(lines[0].split(" ")[0])
        nodes = {}
        nodes[root.name] = root
    
        for line in lines:
            line = line.split(" ")
            name = "".join(line[1:]).strip()
            nodes[name] = Node(name, parent=nodes[line[0]])
    
        for pre, _, node in RenderTree(root):
            print("%s%s" % (pre, node.name))
    

    input.txt

    Parent Child
    A      A1
    A      A2
    A2     A21
    

    输出:

    A
    ├── A1
    └── A2
        └── A21
    

    【讨论】:

    • 嗨@Fabian N 您介意添加您正在使用的 input.txt 文件吗?我认为您的回答可以帮助我,但在没有看到输入的情况下不确定。 “按名称获取对父级的引用”是什么意思? Anytree 有导出/导入方法,会给你精确的根节点,但仅此而已如果可以请提供 input.txt,并且,请检查我的问题stackoverflow.com/questions/51903732/… 非常感谢您
    • N 猜你是直接将输出作为 input.txt 工作?一定有更简单的方法!
    • @gaurwraith 我刚刚将 ops 示例复制到一个文件中,并将其命名为 input.txt。你是对的,我首先尝试使用 anytrees 导入器,但是将操作输入转换为 anytrees 导入器可以理解的东西(基于 json、dict 或缩进)的代码比简单地直接实现要长得多
    • 嗨 Fabian,你能帮我解决这个问题吗docs.google.com/document/d/…?我现在被困了4个多小时。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-27
    • 2017-03-26
    • 1970-01-01
    • 2015-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多