将.dot文件解析为.json

3

我有一个包含很多图形的.dot文件,如下所示:

graph "21" {
    graph [bgcolor="transparent"]
    Node_0 [label="N"];
    Node_1 [label="N"];
    Node_2 [label="C"];
    Node_3 [label="C"];
    Node_4 [label="C"];
    Node_4 -- Node_0 [label="1"];
    Node_2 -- Node_1 [label="1"];
    Node_3 -- Node_2 [label="1"];
    Node_4 -- Node_3 [label="1"];
}# => 2[1 HMDB00001 ,2 HMDB00002]
graph "22" {
    graph [bgcolor="transparent"]
    Node_0 [label="N"];
    Node_1 [label="C"];
    Node_2 [label="C"];
    Node_3 [label="C"];
    Node_1 -- Node_0 [label="1"];
    Node_2 -- Node_1 [label="1"];
    Node_3 -- Node_2 [label="1"];
}# => 2[1 HMDB00001 ,2 HMDB00002]

我在想是否有任何解析器可以将它转换为.json格式,然后我将需要使用这个.json文件来使用D3库可视化图形。
1个回答

0

我编写了这个Python程序,使用pygraphviz加载图形并创建一个简单的JSON文件(将继续保留其他信息)。 JSON格式旨在与Reingold-Tilford树一起使用,例如http://mbostock.github.io/d3/talk/20111018/tree.html

这就是它

import os
import json
import Queue
import argparse
import threading
import pygraphviz as pgv

class Dot2JSON_BFS(threading.Thread):


#----------------------------------------------------------------------
    def __init__(self, file_queue):
        threading.Thread.__init__(self)
        self.file_queue = file_queue
        self.nodeq=Queue.Queue()
        self.traversed_nodes=[]

    def do_bfs(self, fname):
        self.G=pgv.AGraph(fname)
        self.cur_node=self.G.graph_attr['root']

        nodeq = self.nodeq
        cur_node = self.cur_node
        traversed_nodes = self.traversed_nodes
        G = self.G

        self.d = {"name" : cur_node, "children" : [] }

        #self.d[cur_node] = {}
        #cur_list = self.d[cur_node]
        cur_list = self.d["children"]
        nodeq.put((cur_node, cur_list))

        while not nodeq.empty():
            (cur_node, cur_list) = nodeq.get(block=True)
            if cur_node not in traversed_nodes:

                traversed_nodes.append(cur_node)

                for n in G.iterneighbors(cur_node):
                    if n not in traversed_nodes:
                        cur_list.append({"name" : n, "children" : []})
                        nodeq.put((n, cur_list[-1]["children"]), block=True)

        print json.dumps(self.d, indent=4, separators=(',', ': ')).replace('"children": []', '"size": 1')

    def run(self):
        while True:
            # worker retrieving job from thread-safe queue
            fname = self.file_queue.get()

            # do task
            self.do_bfs(fname)

            # signal task completion
            self.file_queue.task_done()


def main(args):
    fnames = args.filenames

    file_queue = Queue.Queue()

    # init thread pool
    for i in xrange(0, len(fnames)):
        d = Dot2JSON_BFS(file_queue)
        d.setDaemon(True)
        d.start()

    # distribute work throughout thread pool
    for fname in fnames:
        file_queue.put(fname)

    # wait for all workers to finish
    file_queue.join()


if __name__ == "__main__":
    parser = argparse.ArgumentParser(description='Parse a Graphviz dot/gv file and convert to JSON format.')
    parser.add_argument('filenames', metavar='filenames', type=str, nargs='+', help='One or more dot/gv filenames for parsing.')
    args = parser.parse_args()
    main(args)

如果格式有任何问题,请原谅。我希望这能帮到其他人,如果您有任何问题,请告诉我。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接