【问题标题】:Python list index out of range on return value of splitPython list index out of range on the return value of split
【发布时间】:2012-06-27 08:26:00
【问题描述】:

我正在编写一个简单的脚本,试图从 .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

我不明白为什么它显然不在范围内。

【问题讨论】:

  • 请提供完整的回溯,以及任何相关变量的值:sscce.org
  • 我是 python 的新手。我如何为您提供完整的追溯?
  • print line 看看你得到了什么

标签: python python-2.7


【解决方案1】:

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

请插入

print len(line), line

在你之前

print line[1]

作为检查是否是这种情况。

你总是可以使用这个结构来测试空行并且只处理/打印-空行:

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

【讨论】:

  • @ayl 如果此页面上的此答案或任何其他答案解决了您的问题,请单击答案旁边的复选标记考虑accepting this question。它将奖励双方一些代表点并将此问题标记为已解决。
【解决方案2】:

当您使用列表并尝试在特定索引处获取值时,始终可以安全地看到索引在范围内

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()

【讨论】:

  • 我发现我的一些输入文件在文本文件的最后一行截断了部分数据(
  • @ayl:我只是想展示在使用列表索引时应该始终使用的方法和保护措施。
【解决方案3】:

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

$ 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]

【讨论】:

    【解决方案4】:

    捕获异常并打印违规行会很有用

    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
    

    【讨论】:

      猜你喜欢
      • 2013-04-27
      • 1970-01-01
      • 1970-01-01
      • 2018-02-08
      • 2014-10-20
      • 2019-02-23
      • 1970-01-01
      • 2014-03-24
      • 2016-05-11
      相关资源
      最近更新 更多