【问题标题】:Using anytree to convert JSON to a image使用 anytree 将 JSON 转换为图像
【发布时间】:2019-06-24 17:16:43
【问题描述】:

我正在尝试使用 anytree 读取 JSON 文件并使用渲染树图将其导出为 png 图像。对于我创建它工作的节点的基本示例。

from anytree import RenderTree
from anytree import Node
from anytree.dotexport import RenderTreeGraph

root = Node("root")
s0 = Node("s0", parent=root)
s1 = Node("s1", parent=root)
t1 = Node("t1", parent=s0)

print(root)
RenderTreeGraph(root).to_picture("test.png")

当我尝试按照 docs 导入 json 文件时

from anytree.importer import JsonImporter
from anytree import RenderTree
from anytree import Node
from anytree.dotexport import RenderTreeGraph
importer = JsonImporter()
path = open("config.json")

root = importer.read(path)
tree = RenderTree(root)
print(tree)

RenderTreeGraph(tree).to_picture("test.png")

我收到以下错误:

Traceback (most recent call last): File "pyth.py", line 20, in <module> DotExporter(tree).to_dotfile("tree.dot") File "/home/user/.local/lib/python3.5/site-packages/anytree/exporter/dotexporter.py", line 214, in to_dotfile for line in self: File "/home/user/.local/lib/python3.5/site-packages/anytree/exporter/dotexporter.py", line 160, in __iter for node in self.__iter_nodes(indent, nodenamefunc, nodeattrfunc): File "/home/user/.local/lib/python3.5/site-packages/anytree/exporter/dotexporter.py", line 174, in __iter_nodes nodename = nodenamefunc(node) File "/home/user/.local/lib/python3.5/site-packages/anytree/exporter/dotexporter.py", line 142, in __default_nodenamefunc return node.name AttributeError: 'RenderTree' object has no attribute 'name'

print(tree) 传递到文本文件中,将 JSON 作为文本块提供,没有空格格式,在文档中,这需要逐行完成以捕获树结构。所以看起来RenderTree(root) 没有按照第一个示例的 Node 样式格式化 JSON。

有谁知道出了什么问题?是否还有正确解析 JSON 的步骤?

【问题讨论】:

  • 你还想要答案吗?
  • 是的,仍然可以做一件有用的事情:)

标签: python json anytree


【解决方案1】:

让我们举一个通用的例子,即你几乎不需要手动做任何事情。

进口

import anytree.exporter as atex
import anytree as at
import json

JSON

(i)a_str_json 下方,是我在https://json.org/example.html 找到的一个 toy-json,它代表了名为 "config.json"(ii) 的文件的内容) a_dict,它的python转换版本。

a_str_json = ("""
{
    "glossary": {
        "title": "example glossary",
        "GlossDiv": {
            "title": "S",
            "GlossList": {
                "GlossEntry": {
                    "ID": "SGML",
                    "SortAs": "SGML",
                    "GlossTerm": "Standard Generalized Markup Language",
                    "Acronym": "SGML",
                    "Abbrev": "ISO 8879:1986",
                    "GlossDef": {
                        "para": "A meta-markup language, used to create markup languages such as DocBook.",
                        "GlossSeeAlso": ["GML", "XML"]
                    },
                    "GlossSee": "markup"
                }
            }
        }
    }
}
""")

a_dict = json.loads(a_str_json)

核心工作

让我们定义tree_builder,这个函数将通过递归探索a_dict来构建我们的树。

def tree_builder(d, p_uid='root', l=0):

    for i, (k, v) in enumerate(d.items()):
        node_uid = 'l{}n{}'.format(l, i)
        node = nodes[k] = at.Node(
            name   = node_uid,
            key    = k,
            parent = nodes[p_uid]
        )
        if isinstance(v, dict):
            node.an_attr = ''
            tree_builder(v, k, l + 1)
        else:
            node.an_attr = v

...并使用它

root  = at.Node(name='root', key='root', an_attr='')
nodes = {'root' : root}
tree_builder(a_dict)

for pre, fill, node in at.RenderTree(root):
    print("%s%s|%s" % (pre, node.key, node.an_attr))

atex.DotExporter(
    root, nodeattrfunc = lambda n : 'label="{}\n{}"'.format(n.key, n.an_attr)
).to_picture("root.png")

产生

root|
└── glossary|
    ├── title|example glossary
    └── GlossDiv|
        ├── title|S
        └── GlossList|
            └── GlossEntry|
                ├── ID|SGML
                ├── SortAs|SGML
                ├── GlossTerm|Standard Generalized Markup Language
                ├── Acronym|SGML
                ├── Abbrev|ISO 8879:1986
                ├── GlossDef|
                │   ├── para|A meta-markup language, used to create markup languages such as DocBook.
                │   └── GlossSeeAlso|['GML', 'XML']
                └── GlossSee|markup


测试在 windows 10 下使用 GraphViz 2.38。

【讨论】:

  • 这似乎工作,除了我没有看到图像,即使我给它一个完整的文件路径来保存。 (我在 Windows 上,不知道这是否有影响)。
  • 错误找不到指定的文件
  • 我的代码在我的用户区的一个文件夹中。跟踪粘贴箱。 pastebin.com/fzhFHUrg
  • 啊,好的。我无法安装 python-graphviz,可能是这样。
  • @MikeS159 不。不要使用 python-graphviz。直接从here下载GraphViz,别忘了把add它的bin文件夹(比如C:\Program Files (x86)\Graphviz2.38\bin)放到路径下。
猜你喜欢
  • 2012-01-08
  • 2021-09-03
  • 2022-11-25
  • 2021-09-24
  • 1970-01-01
  • 2014-01-21
  • 1970-01-01
  • 2017-08-30
  • 2017-11-13
相关资源
最近更新 更多