2014-11-06 98 views
0

。这是我的程序Python的IndexError超出范围

#!/usr/bin/python 
import sys 
fn=sys.argv[1] 
dt=open(fn).readlines() 
    for ln in dt: 
    fd=ln.split() 
    cntw=fd[1].count("W") 
    print cntw 

它完全读取该文件,但在最后给出了错误:

Traceback (most recent call last): 
    File "./task0.py", line 7, in <module> 
    cntw=fd[1].count("W") 
IndexError: list index out of range 

这是为什么,什么我需要改变吗?

+0

点,如果你告诉我们,文件的内容,将是很好的 – Hackaholic 2014-11-06 20:59:33

回答

2

你的最后一行是空的,跳过它:

for ln in dt: 
    fd = ln.split() 
    if not fd: 
     continue 

一个空行的结果是空列表:

>>> ''.split() 
[] 

not fd测试为真空集装箱。

请注意,您不必首先将所有行读入内存;放弃readlines()调用并直接在打开的文件对象上循环;使用with声明已经做时Python会自动为你关闭它:

with open(fn) as fileobj: 
    for ln in fileobj: 
     fd = ln.split() 
     if not fd: 
      continue 
     cntw = fd[1].count("W") 
     print cntw 
+0

什么是只有一条线有一个元素? '如果len(fd)<2'确保至少有两个元素 – 2014-11-06 21:00:00

+0

^Padraic说。使用异常处理好得多。 – mdadm 2014-11-06 21:06:02

+0

@PadraicCunningham:或许OP *想要*在一行中没有第二个元素时得到异常?空行通常很好。 – 2014-11-06 21:15:23

1

该文件的内容将有助于了解你们怎么做到的,但这里是一个更Python的解决方案。您应该使用try和except语句来捕获异常,并使用with关键字(如Martijn Pieters建议的)在完成时自动关闭文件。

此外,这不是20世纪90年代...我会建议使用变量名称,以了解其目的。我不知道你正在尝试做的,但我做了一些修改,试图让整个:)

#!/usr/bin/python 
import sys 
filename = sys.argv[1] 

with open(filename) as datafile: 
    for line in datafile: 
     words = line.split() 

     try: 
      wcount = words[1].count("W") 
     except IndexError: 
      continue 
相关问题