Python 抛出 IndexError: 列表索引超出范围,使用 CSV

1 投票
1 回答
1261 浏览
提问于 2025-04-18 18:39

我在一个Python程序中遇到了读取CSV文件的错误。最让人困惑的是,这个错误一开始并不存在,之前也“时有时无”,现在又回来了。这个程序很简单,而源CSV文件从来没有被修改过。以下是相关的代码片段...

  with open('/home/rob/Applications/Ambient/timings.csv', 'rt') as csvfile:
  fr = csv.reader(csvfile, delimiter=',', quotechar='|')
  for row in fr:
    previous=delay
    delay=0
    millis = int(row[1])

这个CSV文件的结构是这样的:

0,824 
1,496 
0,356 
1,792 
0,388 
0,764 
1,560 
0,1264 
1,724 
0,2820 
1,496 
for ~88k lines

这是出现的错误信息:

追踪记录(最近的调用在前): 文件 "/home/rob/Applications/Ambient/AmbientDecode_02.py",第82行,在 millis = int(row[1]) IndexError: 列表索引超出范围

从上面可以看到,程序在设置好访问CSV文件后,就开始访问row[1],一开始并没有出错。但是当错误后来出现时,我肯定没有修改过Python代码的那部分,也没有改动CSV文件。为了打发时间,我开始写后面的代码,突然程序又能运行了。现在又停止了,之前的索引错误又回来了。如果我在millis = int(row[1])后面加上print row,程序就能运行???

我需要一个明确的答案,因为我不能继续在后面的代码上瞎折腾,希望能修复一个我根本不知道为什么崩溃的代码???

有什么想法吗?

Rob

1 个回答

0

这个错误的意思是,在后面的大约88,000行中,有一行缺少逗号和逗号后面的第二个数据。你可以修改程序,让它更好地处理这个错误,方法如下:

with open('/home/rob/Applications/Ambient/timings.csv', 'rt') as csvfile:
    fr = csv.reader(csvfile, delimiter=',', quotechar='|')
        for row in fr:
            previous=delay
            delay=0
            try:
                millis = int(row[1])
            except IndexError:
                pass

上面的代码会忽略找不到第二个数据(逗号后面的数据)的那一行,然后继续处理下一行。你也可以自己定义在这种情况下该怎么做,只需把上面代码中的pass替换成你想要的逻辑就可以了。

撰写回答