【问题标题】:IndexError: list index out of range-PythonIndexError:列表索引超出范围-Python
【发布时间】:2013-06-04 16:54:27
【问题描述】:

我正在使用 python 分析一个 Apache 访问日志文件,我想从中提取 Referrer 字段。 Referrer 位于第 9 个位置,使用空格作为分隔符。 (用空格分割后总共有9个以上的字段。)以下代码将提取的字段写入文件。

for line in open('log'):
    referer = line.split(' ')[9]
    fo.write(referer +'\n')

这里的问题是referrer字段被写入文件,但程序给出以下错误?可能是什么问题?

Traceback (most recent call last):
  File "temp.py", line 18, in <module>
    referer = line.split(' ')[9]
IndexError: list index out of range

示例日志文件行:

112.135.128.20 - [13/May/2013:23:55:04 +0530] "GET /SVRClientWeb/ActionController HTTP/1.1" 302 2 "https://www.example.com/sample" "Mozilla/5.0 (iPhone; CPU iPhone OS 6_1_3 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Mobile/10B329" GET /SVRClientWeb/ActionController - HTTP/1.1 www.test.com

【问题讨论】:

  • 这意味着并非所有的行看起来都一样。可能有几行比这一行短。
  • 可能其中一行被缩短了,这会破坏你的脚本。
  • 包含一个 try/except 代码,打印出引发异常的行,以便您可以验证该行是否不遵循模式
  • @jabaldonedo 谢谢,成功了!

标签: python list


【解决方案1】:

文件中的某处可能有一个空行(可能末尾有一个额外的换行符),或者只是一个较短的行。

您可以(例如)使用 enumerate 来查找它!

for i, line in enumerate(f):

【讨论】:

    【解决方案2】:

    这意味着文件中的其中一行在拆分后没有 [9] 索引。检查文件。打印行号以检查错误在哪里

    i=0
    for line in open('log'):
        referer = line.split(' ')[9]
        fo.write(referer +'\n')
        print i
        i+=1
    

    你会在 vim 或任何编辑器的那个地方找到行号和检查行。

    【讨论】: