【发布时间】:2015-04-27 22:32:09
【问题描述】:
我无法解决“列表索引超出范围”错误。该代码似乎运行良好,直到 file_no2 = line2.split()[0] 生成索引错误的某个点。该错误显示在正在读取的文件末尾之前的 70 行,因此我无法弄清楚为什么会出现“列表索引超出范围错误”。我试图遍历文件,直到 line2 被文件中的最后一行数据填充,因此我使用了 range 函数和先前计算的文件中行数的总和 (l)。我在范围计算中减去 1,目的是在 line1 被文件中倒数第二行填充后停止循环。但同样,索引错误是在距离文件末尾不到 70 行的地方停止进程,所以我不明白为什么它超出了范围。
for i in range(l-1):
line1 = trackdata.readline()
line2 = trackdata.readline()
file_no1 = line1.split()[0]
time1 = line1.split()[1]
x1 = line1.split()[2]
y1 = line1.split()[3]
length1 = line1.split()[4]
flow_dir1 = float(line1.split()[5])
flow_mag1 = line1.split()[6]
file_no2 = line2.split()[0]
time2 = line2.split()[1]
x2 = line2.split()[2]
y2 = line2.split()[3]
length2 = line2.split()[4]
flow_dir2 = float(line2.split()[5])
flow_mag2 = line2.split()[6]
if file_no1 == file_no2:
if abs(flow_dir2 - flow_dir1) > 90.0:
print x1, y1
#print >> coordinates2, x2, y2
这是一个结果示例:
185313.5426 112700.3316
1091 153.4636750 184498.3329 112815.9754 100.0000000 344.7592449 0.6516200005
184500.6344 112716.0019
1091 649.7940156 184461.4951 113012.3586 300.0000000 353.5487391 0.3463617710
1091 1599.736768 184398.7140 113126.0630 440.6196278 341.8759486 0.1121731124
1091 1734.946452 184382.9241 113119.2729 457.9156941 349.0664262 0.1303822198
...
1123 0.0000000000 184110.8309 113518.9487 0.0000000000 271.3035311 0.1646996924
以及错误信息:
Traceback(最近一次调用最后一次): 文件“O:\ArcGIS\courseypond\particletrack\check_trackangle_5yr”,第 28 行,在 > file_no2 = line2.split()[0] IndexError: 列表索引超出范围
输入数据是从包含 14910 行的以空格分隔的文本文件中读取的。每行数据的格式如上面的示例结果所示:文件编号、时间、x 坐标、y 坐标、长度、流向、流量大小。目的是识别并存储具有相同文件编号标识符的两条线的流向变化大于90度时的坐标点。
【问题讨论】:
-
你能发布确切的错误和一些示例输入吗?如果可能,发布一个最小的示例(以便我们可以重现错误)将有很大帮助。难道是文件很糟糕?也许一行中只有 3 项,所以
line.split()[4]失败。 -
在错误前打印出
line2 -
如果
file_no2 = line2.split()[0]出现错误,那么我猜 line2 是空的。 -
@syntonym:我更新了讨论以包括错误消息的文本和输出结果的示例。输入文件包含 14910 行数据,并且错误发生在距离文件末尾不到 70 行的地方,所以我不确定仅使用最小的输入数据样本如何重现。生成错误的代码调用该行的第一项,该行始终存在于文件的最后一行。
-
@RPGillespie 如果我添加 print line2 命令,很明显循环会循环遍历文件直到倒数第二行(请参阅添加到问题讨论中的示例结果)。打印的最后 line2 是文件中倒数第二行,我猜这意味着文件的最后一行将没有 line2 与 line1 匹配。这让我觉得我需要在循环末尾添加一个语句,将新的 line1 等同于现有的 line2。也许我需要在循环外设置初始 line1 和 line2?
标签: python indexoutofboundsexception