我的 networkx 代码有问题。我试图列出我的边缘的属性,但我不断收到 KeyError 或者当我尝试捕获错误时它会跳过整个代码。
背景:我有一个图表,其边缘表示防火墙规则,具有协议、源端口、目标端口的自定义属性,边缘标签包含操作(允许或拒绝),而边缘之间的节点是源地址和目标地址。 .. 协议、源和目标端口的默认值是 IP、any、any...
我试图做什么:我试图一一列出所有边缘(规则)及其各自的属性,例如:
Rule has PROTOCOL: tcp ACTION: allow sPORT: 6667 dPORT: 6667
问题:在某些情况下,我对协议、源端口和目标端口使用默认值,因此即使我尝试这些值也不会显示
for u,v,n in G.edges_iter(data=True):
print ('%s %s %s' % (u,v,n))
当我尝试
print ('Rule has PROTOCOL: %s ACTION: %s sPORT: %s dPORT: %s' % (n['protocol'],n['label'], n['s_port'], n['d_port']))
我得到了一个KeyError
提升,因为在某些边缘我没有声明协议或 s_port 或 d_port。当我尝试在 KeyError 上使用 try 和 except(continue) 时,它会跳出 for 循环并继续执行我的代码的其余部分。
问题:当边缘属性不可用时,如何处理 KeyError 或输入诸如“任何”或“无”或“未声明”之类的内容,我希望我的代码打印如下内容:
Rule has PROTOCOL: tcp ACTION: allow sPORT: any dPORT: any
当我使用源端口和目标端口的默认值而不是跳过代码时
这就是我的代码的样子:
import os
import sys
import string
import networkx as nx
G = nx.read_graphml("fwha.graphml")
count = 0
edges = G.number_of_edges()
nodes = G.number_of_nodes()
print "Number of edges in diagram is: ", edges
for u,v,n in G.edges_iter(data=True):
try:
print ('Rule has PROTOCOL: %s ACTION: %s sPORT: %s dPORT: %s' % (n['protocol'], n['label'], n['s_port'], n['d_port']))
except KeyError:
continue
print "Number of nodes in diagram is: ", nodes
for m,k in G.nodes_iter(data=True):
print('%s %s' % (k,m))