你滥用了这个功能read_edgelist
。来自文档 https://networkx.github.io/documentation/stable/reference/readwrite/edgelist.html,每一行需要解析一个字符串,而csv.reader
将输入文件中的行解析为字符串列表(例如,202,237,1 -> ['202', '237', '1']
)。所以,AttributeError
被提出是因为read_edgelist
正在尝试解析由提供的列表csv.reader
,而它们应该是字符串。
我们可以正确解析输入文件中的图形,而无需使用csv
模块。但是,我们仍然需要处理输入文件的第一行(标题),不应对其进行解析。有两种方法。第一种方法使用跳过第一行next
:
Data = open('test.csv', "r")
next(Data, None) # skip the first line in the input file
Graphtype = nx.Graph()
G = nx.parse_edgelist(Data, delimiter=',', create_using=Graphtype,
nodetype=int, data=(('weight', float),))
第二种方法有点“hacky”:因为第一行以target
,我们标记这个字符t
作为输入文件中注释的开头。
Data = open('test.csv', "r")
Graphtype = nx.Graph()
G = nx.parse_edgelist(Data, comments='t', delimiter=',', create_using=Graphtype,
nodetype=int, data=(('weight', float),))
在这两种方法中,我们都必须使用parse_edgelist
代替read_edgelist
因为输入文件使用\r
对于换行符。使用read_edgelist
,文件需要以二进制模式打开,其行被分割 iff换行符是\r\n or \n https://docs.python.org/3/library/io.html#io.IOBase.readline。因此输入文件\r
换行符无法分割成行,因此无法正确解析。
另外,由于您想找到入度和出度,因此应使用以下命令创建图表DiGraph
, not Graph
.
Edit
这里的关键点是跳过输入文件中的标头。我们可以通过首先将输入文件读入pandas.DataFrame
,然后我们将其转换为图表。
import networkx as nx
import pandas as pd
df = pd.read_csv('test.csv')
Graphtype = nx.Graph()
G = nx.from_pandas_edgelist(df, edge_attr='weight', create_using=Graphtype)