列表索引超出范围错误 - 请求帮助

时间:2018-05-20 02:43:02

标签: python python-3.x

我正在尝试在bgp_summary字符串中的每一行中获取第一项,并创建一个新的列表。我为此目的使用下面的代码,但得到“列表索引超出范围”错误。我相信我所指的列表索引并没有超出范围,但不确定为什么会出现这种错误。 如果有人可以提供帮助,我将不胜感激。

bgp_summary = """

10.0.13.213     65510    658     86       0       0  2d 3:43:06 Establ
172.46.42.134   65513    819     7        0      11  2d 3:50:49 Establ
172.57.13.1     65501    15427   52       0       0  0d 2:26:01 Establ
172.57.13.249   65513    13449   2517     0       0  2d 3:50:21 Establ
172.57.13.250   65513    134     2515     0       0  4d 3:50:21 Establ
172.57.13.252   65513    46      142      0       0     3:50:32 Establ

"""

bgp_peers_list_raw = []
bgp_peers_list_refined = []
bgp_peers_list_raw = bgp_summary.splitlines()

n=0
for n in range (len(bgp_peers_list_raw)):
    list_raw1 = []
    list_raw1 = bgp_peers_list_raw[n].split()
    bgp_peers_list_refined.append(list_raw1[0])


bgp_peers_list_refined.append(list_raw1[0])
IndexError: list index out of range

2 个答案:

答案 0 :(得分:2)

你的一些行是空的。如果你放弃那些:

代码:

bgp_peers_list_raw = [l.strip() for l in bgp_summary.splitlines() 
                      if l.strip()]

它会正常工作。

测试代码:

bgp_summary = """

10.0.13.213     65510    658     86       0       0  2d 3:43:06 Establ
172.46.42.134   65513    819     7        0      11  2d 3:50:49 Establ
172.57.13.1     65501    15427   52       0       0  0d 2:26:01 Establ
172.57.13.249   65513    13449   2517     0       0  2d 3:50:21 Establ
172.57.13.250   65513    134     2515     0       0  4d 3:50:21 Establ
172.57.13.252   65513    46      142      0       0     3:50:32 Establ

"""

bgp_peers_list_raw = []
bgp_peers_list_refined = []
bgp_peers_list_raw = [l.strip() for l in bgp_summary.splitlines()
                      if l.strip()]

n = 0
for n in range(len(bgp_peers_list_raw)):
    list_raw1 = []
    list_raw1 = bgp_peers_list_raw[n].split()
    bgp_peers_list_refined.append(list_raw1[0])

bgp_peers_list_refined.append(list_raw1[0])
print(bgp_peers_list_refined)

结果:

['10.0.13.213', '172.46.42.134', '172.57.13.1', '172.57.13.249',
 '172.57.13.250', '172.57.13.252', '172.57.13.252']

答案 1 :(得分:0)

这是因为bgp_summary有一些空行。

最简单,最直接的解决方案是将您的bgp_summary转换为:

bgp_summary = """

10.0.13.213     65510    658     86       0       0  2d 3:43:06 Establ
172.46.42.134   65513    819     7        0      11  2d 3:50:49 Establ
172.57.13.1     65501    15427   52       0       0  0d 2:26:01 Establ
172.57.13.249   65513    13449   2517     0       0  2d 3:50:21 Establ
172.57.13.250   65513    134     2515     0       0  4d 3:50:21 Establ
172.57.13.252   65513    46      142      0       0     3:50:32 Establ

"""

为:

bgp_summary = """10.0.13.213     65510    658     86       0       0  2d 3:43:06 Establ
172.46.42.134   65513    819     7        0      11  2d 3:50:49 Establ
172.57.13.1     65501    15427   52       0       0  0d 2:26:01 Establ
172.57.13.249   65513    13449   2517     0       0  2d 3:50:21 Establ
172.57.13.250   65513    134     2515     0       0  4d 3:50:21 Establ
172.57.13.252   65513    46      142      0       0     3:50:32 Establ"""

虽然看起来并不好看但能解决你的问题。

使bgp_summary保持不变的更复杂的解决方案只是对你的for循环的一个小修改。

而不是像这样检查每一行:

range(len(bgp_peers_list_raw))

您可以在开头和结尾排除空的,如下所示:

#2 empty lines at the start
#1 empty line at the end
range(2, len(bgp_peers_list_raw)-1)