我编写了这个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" : [] }
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:
fname = self.file_queue.get()
self.do_bfs(fname)
self.file_queue.task_done()
def main(args):
fnames = args.filenames
file_queue = Queue.Queue()
for i in xrange(0, len(fnames)):
d = Dot2JSON_BFS(file_queue)
d.setDaemon(True)
d.start()
for fname in fnames:
file_queue.put(fname)
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)
如果格式有任何问题,请原谅。我希望这能帮到其他人,如果您有任何问题,请告诉我。