在一个dot文件中解析多个有向图

9 投票
2 回答
3108 浏览
提问于 2025-04-16 12:42

我正在尝试处理和渲染一些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

撰写回答