在一个dot文件中解析多个有向图
我正在尝试处理和渲染一些DOT格式的图。
我手上的dot文件很大(大约300MB),里面包含了多个有向图。
digraph 1 {...}
digraph 2 {...}
digraph 3 {...}
我有两个问题:
1. 有没有办法只渲染一个有向图,而不是整个图?
比如说像这样 dot -3 -Tps mygraph.dot -o out.ps
只渲染第3个有向图?
2. 有哪个Python库是处理dot格式的最佳选择?(其他语言也可以)
我试过两个库,但效果都不太好。
pydot 这个库在导入后给我一个有向图的列表,这个很好,但它不能处理节点名称中的“.”。比如 nd.nd [label="nd_node"]
这个就会出错。
pygraphviz 这个库能处理“.”,但是在文件中有多个图定义时,它只会导入第一个有向图 :(
2 个回答
2
我不确定这是不是你想要的,但你只需要写一个简单的解析器,或者你想怎么称呼它都可以。pygraphviz处理文件输入的方式很简单,就是像处理字符串输入那样读取和解析。
所以,这里有一段示例代码:
f = open(filename, 'r')
graph = [[]]
while True:
line = f.readline()
if not line:
break
if declare_new_graph(line):
graph.append([])
graph[-1].append(line)
#now you have a list of graphs
#each is a list of lines
#with first line containing the name
#to get the string representation of graph "i"
str = '\n'.join(graph[i])
2
既然你已经有了 dot
,那么你也应该有 gvpr
,这是一个处理图形的工具。你可以用一个简单的 gvpr
脚本来打印第三个图,像这样:
BEGIN { int count = 0; }
BEG_G {
count = count + 1;
if(count == 3) {
write($G);
}
}
接着,你可以把这个当作源过滤器来使用:
cat mygraph.dot | gvpr -f thirdgraph.gv | dot -Tps -o out.ps