Формат, ожидаемый add_edges_from
, представляет собой список кортежей в его наиболее простой форме в виде списка (u, v) пар для подключения.
Ваши файлы не имеют данных в соответствующей форме, поэтому networkx не знает, что с ними делать.Если текст в точности соответствует тому, что вы написали в переменной «dge », то ниже приведен один из способов вписать его в правильный список.Вы можете сделать то же самое для обработки узла, хотя для этого нужен только список элементов, а не список кортежей, так что это более просто.
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)
Вы должны прочитать документы по чтению в графиках здесь: https://networkx.github.io/documentation/stable/reference/readwrite/index.html
, который описывает, как читать из различных стандартных форматов графиков.
РЕДАКТИРОВАТЬ после комментария:
Причина, по которой у вас много "неожиданных" узлов в графе, заключается в том, что nx.add_nodes_from принимает итеративный тип,и когда вы читаете весь файл в текстовую переменную, перебор этой строки занимает один символ за раз.Это создает односимвольные узлы, такие как 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_txt
в форму node_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