Python 添加节点和边时出现错误的Networkx

Python 添加节点和边时出现错误的Networkx,python,networkx,Python,Networkx,这是一个生成网络图的简单python程序。当我将数据放入程序中时,一切都很好,但当我决定将数据放入两个输入文件时,事情开始变得有趣起来。有两个输入文件:节点(或顶点)和边。当我从名为“Step3 Vertices.txt”的输入文件中读取节点信息时,它没有给出任何错误,但向节点添加了我没有提供的附加信息。以下是附加信息列表: “[”、“{”、“2”、“0”、“2”、“6”、“8”、“W”、“}”、“1”、“5”、“3”、“7”、“4”、“O”、“X”、“D”、“4”、“n” 然后,我阅读了第二个

这是一个生成网络图的简单python程序。当我将数据放入程序中时,一切都很好,但当我决定将数据放入两个输入文件时,事情开始变得有趣起来。有两个输入文件:节点(或顶点)和边。当我从名为“Step3 Vertices.txt”的输入文件中读取节点信息时,它没有给出任何错误,但向节点添加了我没有提供的附加信息。以下是附加信息列表:
“[”、“{”、“2”、“0”、“2”、“6”、“8”、“W”、“}”、“1”、“5”、“3”、“7”、“4”、“O”、“X”、“D”、“4”、“n”

然后,我阅读了第二个名为“Step3 Edges.txt”的文件,这次我得到了一个我无法理解的错误消息列表

错误消息-从文件添加边缘信息时NETWORKX失败:

Traceback (most recent call last):
File "step4_test1.py", line 30, in <module>
G.add_edges_from(data_edges)
File "/home/desmond/anaconda3/lib/python3.6/site-packages/networkx/classes/graph.py", line 934, in add_edges_from
"Edge tuple %s must be a 2-tuple or 3-tuple." % (e,))
networkx.exception.NetworkXError: Edge tuple [ must be a 2-tuple or 3-tuple.
所期望的格式是元组列表,以其最基本的形式,作为要连接的(u,v)对列表

您的文件没有适当格式的数据,因此networkx不知道如何处理它们。如果文本与您在“edges”变量中所写的完全相同,那么下面是一种将其推送到正确类型列表中的方法。您可以对节点处理执行类似的操作,尽管这只需要元素列表,而不需要元组列表,因此更简单

with open("edgefile.txt") as data_file:
    data_edges = data_file.read()

# split on the comma, assuming this divides elements, remove the curly braces and quotes
elems = ([f.strip(" {}'") for f in data_edges.strip().split(',')])
# use zip to turn the flat list into a lst of pairs
edge_list = zip(elems[::2], elems[1::2])

# now we are in a form that nx.add_edges_from can handle
G = nx.Graph()
G.add_nodes_from(nodes)
G.add_edges_from(edge_list)
您应该在这里阅读关于阅读图表的文档:

它描述了如何读取各种标准图形格式


编辑评论中的以下qu:

在图形中有许多“意外”节点的原因是,nx.add_nodes_from采用了一种iterable类型,并且当您将整个文件读入文本变量时,在该字符串上迭代一次需要一个字符。这将生成单字符节点,如
0
'
\n
。因此,我们可以通过将字符串解析为一个列表来修复它,并在列表上迭代得到一个元素,如
'0000000002'

以下是一个例子:

# assume that the file describing nodes is read into this string:
node_txt = "'0000000002', '0000000101', '0000000111', '0000000200', '0000000502', '0000000600', '0000001000', '0000001001', '0000001069', '0000001253', '0000001462', '0000003013', '0000003200', '0000004100', '0000004305', '0000005100', '0000005460', '0000006600', '0000010021', '0000010101', '0000010200', '0000010314', '0000012000', '0000012151', '0000012600', '0000015201', '0000016100', '0000017002', '0000020002', '0000020050', '0000020100', '0000021001', '0000022044', '0000022100'\n"

G1 = nx.Graph()
G1.add_nodes_from(node_txt)
print(G1.nodes())
print(set(node_txt))
# output of these two commands shows that the node names are 1 char each:
>>> [' ', "'", '\n', ',', '1', '0', '3', '2', '5', '4', '7', '6', '9']
>>> set([' ', "'", '\n', ',', '1', '0', '3', '2', '5', '4', '7', '6', '9'])

# reference: what we really wanted    
node_list = ['0000000002', '0000000101', '0000000111', '0000000200', '0000000502', '0000000600', '0000001000', '0000001001', '0000001069', '0000001253', '0000001462', '0000003013', '0000003200', '0000004100', '0000004305', '0000005100', '0000005460', '0000006600', '0000010021', '0000010101', '0000010200', '0000010314', '0000012000', '0000012151', '0000012600', '0000015201', '0000016100', '0000017002', '0000020002', '0000020050', '0000020100', '0000021001', '0000022044', '0000022100']

G2  = nx.Graph()
G2.add_nodes_from(node_list)
print(G2.nodes())
print(set(node_list))
那么如何将
node\u txt
转换为
node\u list
的形式呢?对于边,我们遵循与上述相同的过程-这一过程稍微简单一些

elems = [f.strip(" '") for f in node_txt.strip().split(',')]
print(elems == node_list)
# output: True -> so here we recovered the node names correctly from node_txt

非常感谢。我测试了你的代码,它正在我的程序中工作。顺便问一下,如何处理Networkx生成的其他节点。当我从名为“Step3 Vertices.txt”的输入文件中读取节点信息时,它没有给出任何错误,但向节点添加了我没有提供的附加信息。这是一个附加信息列表:“[”、“{”、“0”、“2”、“2”、“6”、“8”、“W”、“}”、“1”、“5”、“3”、“7”、“4”、“O”、“X”、“D”、“D”]、“\n”。这些额外的节点对我没有用。我不知道它是从哪里来的。我如何摆脱它们?问题与上述相同。我没有尝试猜测节点文件的结构,但是当您使用
.read()
时,python会给您一个字符串。上面的代码将由逗号分隔的元素列表转换为元组列表。对于节点列表,您可能需要执行相同的操作。否则,字符串将在
G中解释。将\u节点\u from()添加为字符列表
elems = [f.strip(" '") for f in node_txt.strip().split(',')]
print(elems == node_list)
# output: True -> so here we recovered the node names correctly from node_txt