使用Python的networkx库探索网络属性

3

我正在尝试编写一个用于获取Twitter网络属性的代码。

但是我的代码出现了错误,我不知道为什么会发生这种情况。

错误信息如下:

Traceback (most recent call last):
  File "Network_property.py", line 14, in <module>
    followee = line.strip().split('\t')[1]
IndexError: list index out of range

代码如下:
import os, sys
import time
import networkx as nx


DG = nx.DiGraph()

ptime = time.time()
j = 1

#for line in open("./US_Health_Links.txt", 'r'):
for line in open("./test_network.txt", 'r'):
    follower = line.strip().split('\t')[0]
    followee = line.strip().split('\t')[1]

    DG.add_edge(follower, followee)

    if j%1000000 == 0:
        print j*1.0/1000000, "million lines done", time.time() - ptime
        ptime = time.time()
    j += 1

print nx.number_connected_components(DG)

我收集了一些链接数据,就像这样:

1000    1001
1000    1020191
1000    10267352
1000    10957902
1000    11039092
1000    1118691
1000    11882
1000    1228281
1000    1247041
1000    12965332
1000    13027572
1000    13075072
1000    13183162
1000    13250162
1000    13326292
1000    13452672
1000    13844892
1000    14061830
1000    1406481
1000    14134703
1000    14216951
1000    14254402
1000    14258044
1000    14270791
1000    14278978
1000    14313332
1000    14392970
1000    14441172
1000    14497568
1000    14502775
1000    14595635
1000    14620544
1000    14632615
1000    14680596
1000    14956164
1000    14998341
1000    15132211
1000    15145450
1000    15285998
1000    15288974
1000    15300187
1000    1532061
1000    15326300

"1000"是关注者,其他人是被关注者。

+

我想要得到以下结果:(1) 连通分量的数量,(2) 最大连通分量中节点的比例,(3) 入度的平均值和中位数,(4) 出度的平均值和中位数,(5) 直径,以及 (6) 聚集系数。但是网站 "networkx.lanl.gov" 无法使用。

有没有人可以帮帮我?


1
你确定 test_network.txt 文件里面用的是制表符吗?或许可以把两个 split('\t') 改为 split(),然后看看会发生什么。 - David Alber
如果您的评论是一个答案,我会点赞它... - Michael J. Barber
2个回答

1
您提供的network.txt文件示例中没有制表符,而是空格。如果您将split('\t')的实例更改为split(),它将在任何空格上拆分,因此无论文件中有空格还是制表符,它都可以处理。

1

这个错误与networkx无关。问题在于某些行line.strip().split('\t')只返回了一个字段。我猜测问题可能出现在文件中的空行上。请比较:

>>> ''.split("\t")
['']
>>> ''.split("\t")[1]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: list index out of range
>>>

因此,空行可能会导致问题。您可以明确地检查此问题,例如通过添加以下内容:
if not line:
    continue

在你的for循环开始时。

另外,如果您不需要显示进度print语句,则可以查看networkx.read_edgelist,这应该是最简单的方法。


谢谢你的帮助!我没有仔细检查我的数据。 - ooozooo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接