【问题标题】:parsing .dot file to .json将 .dot 文件解析为 .json
【发布时间】:2015-04-26 20:11:24
【问题描述】:

我有一个包含很多图表的 .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 库来可视化图表。

【问题讨论】:

    标签: json d3.js dot


    【解决方案1】:

    我编写了这个 python 程序,它使用 pygraphviz 加载图形并创建一个简单的 json 文件(将致力于保留其他信息)。 json 格式用于 reingold-tilford-trees,例如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)
    

    如果格式有任何问题,我深表歉意。我希望这对其他人有帮助,如果您有任何问题,请告诉我。

    【讨论】:

      猜你喜欢
      • 2018-08-31
      • 2023-03-31
      • 1970-01-01
      • 1970-01-01
      • 2018-11-07
      • 1970-01-01
      • 2017-11-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多