Python列表索引超出了分割的返回值范围

时间:2012-06-26 23:28:15

标签: python python-2.7

我正在编写一个简单的脚本,试图从.txt输入文件的第二列中提取第一个元素。

import sys

if (len(sys.argv) > 1):
    f = open(sys.argv[1], "r");
    print "file opened";

line = [];

for line in f:
    line = line.strip("\n ' '")
    line = line.split(",") 
    print line[1]

f.close();

我的输入文件如下所示:

Client 192.168.1.13 said ``ACC: d0bb38f18da536aff7b455264eba2f1e35dd976f,389182.567,-0.042,-0.893,0.333''
Client 192.168.1.13 said ``ACC: d0bb38f18da536aff7b455264eba2f1e35dd976f,389182.590,-0.036,-0.905,0.273''
Client 192.168.1.13 said ``ACC: d0bb38f18da536aff7b455264eba2f1e35dd976f,389182.611,-0.046,-0.948,0.204''
Client 192.168.1.13 said ``ACC: d0bb38f18da536aff7b455264eba2f1e35dd976f,389182.631,-0.074,-0.978,0.170''
Client 192.168.1.13 said ``ACC: d0bb38f18da536aff7b455264eba2f1e35dd976f,389182.654,-0.100,-1.006,0.171''

我希望我的分隔符是逗号。当我打印出行的长度时,我得到5个元素(如预期的那样)。但是,每当我尝试索引列表以提取数据时(即,当我调用print line[1]时),我不断收到以下错误:

file opened
Traceback (most recent call last):
  File "stats.py", line 13, in <module>
    print line[1]
IndexError: list index out of range

我不明白为什么它显然超出了范围,显然不是。

4 个答案:

答案 0 :(得分:7)

我猜你的文件中有一个空行。如果它运行数据然后生成异常,则空行将位于文件的末尾。

请插入

print len(line), line

之前

print line[1]

作为检查以确认是否是这种情况。

您始终可以使用此构造测试空行并仅处理/打印 - 空白行:

for line in f:
    line = line.strip()
    if line:
       # process/print line further

答案 1 :(得分:2)

您的数据后可能有空行,我没有它们运行您的测试代码,它按预期工作。

$ python t.py t.txt
file opened
389182.567
389182.590
389182.611
389182.631
389182.654

如果你不想删除它们,那么只需检查空行。

for line in f:
    if line.strip(): # strip will remove all leading and trailing whitespace such as '\n' or ' ' by default    
        line = line.strip("\n ' '")
        line = line.split(",") 
        print line[1]

答案 2 :(得分:0)

当你使用list并尝试在特定索引处获取值时,在index中看到的范围总是安全的

if len(list_of_elements) > index: 
   print list_of_elements[index]

请参阅:

>>> list_of_elements = [1, 2, 3, 4]
>>> len(list_of_elements)
4
>>> list_of_elements[1]
2
>>> list_of_elements[4]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: list index out of range
>>> 

现在你必须找出你的列表中没有包含你预期的元素的原因

解决方案:

import sys

if (len(sys.argv) > 1):
    f = open(sys.argv[1], "r")
    print "file opened"

for line in f:
    line = line.strip().strip('\n')
    # Ensure that you are not working on empty line
    if line:
        data = line.split(",") 
    # Ensure that index is not out of range
    if len(data) > 1: print data[1]

f.close()

答案 3 :(得分:0)

抓住异常打印违规行

会很有用
for line in f:
    line = line.strip("\n ' '")
    line = line.split(",") 
    try:
        print line[1]
    except IndexError, e:
        print e
        print "line =", line
        raise   # if you don't wish to continue