CSV - 列表索引超出范围

8

我在读取CSV文件时遇到了错误(无标题,3列,第2列和第3列为字符串):

Traceback (most recent call last):
File "C:\Python32\fantasy.py", line 72, in module>
some=row[1]
IndexError: list index out of range*    

以下是部分代码。这些都是非常简单的东西,但我却不知道为什么它不工作。我是编程新手,但以前已经处理过csv模块,从来没有遇到过这个问题,并且只是在记事本中创建了一些测试csv文件,看看是否能够从相同的代码中读取,结果确实可以。我不知道怎么回事。

import csv
##############some other code, working good and I believe not relevant to this problem
file=open(r"C:\Users\me\Desktop\file-2.csv","r")
reader=csv.reader(file, delimiter=',', quotechar='"')

for row in reader:
    some=row[1]

1
在错误之前打印repr(row)。如果字段中可能包含嵌入换行符,请使用newline =''打开。 - jfs
无论如何,我不知道这是否重要,但我使用shutil创建了与我正在尝试读取的相同文件。 - morris
1
你能展示一下你正在尝试读取的文件内容吗?其中一行可能太短了。 - nneonneo
首先,第一列是案件号码。- 1,阿森纳,马诺内 2,阿森纳,詹金森等等 - morris
  1. 在你的代码中,在 some=row [1] 行之前添加一行 print(repr(row)),复制粘贴最后一个被打印的东西,直到看到 Traceback...
  2. 查看文档中的第一个代码示例,了解如何使用 newline=''。链接:http://docs.python.org/dev/library/csv
- jfs
显示剩余3条评论
4个回答

19

尝试检查空行。同时,避免使用file作为变量名。使用"r"打开文件是默认模式。

import csv

with open(r"C:\Users\me\Desktop\file-2.csv") as f:
     reader = csv.reader(f, delimiter=',', quotechar='"')
     for row in reader:
        if row:
            some=row[1]

2
Python 3 中没有 file 内置函数。即使在 Python 2 中,file 也是一个例外,可以用作变量名(建议使用 open() 替代 file(),这是太好的名称可不要忽略)。 - jfs

6

看起来你有一行空行或其他内容。默认情况下,for循环的每次迭代会从csv文件中获取一行文本。该行文本以换行符结束。因此,如果您有空白行,则读者将其读取为类似于[]的内容。

按照以下步骤操作,你就会知道我的意思:

for row in reader:
    print(repr(row))
    some = row[1]

你会发现最后打印的一行长度不足2个字符。
有几种方法可以解决这个问题:
  1. 通过清理脚本来删除空白行
  2. 在调用reader时更改换行符

6

这个问题很旧了,但是我遇到了一个稍微不同的解决方案,所以我会在这里分享给其他可能遇到这个问题的人。我的文件太大了,我看不到它的末尾。最后一行只有两个而不是我文件中典型的五个,所以当我试图获取第四列时,它给了我这个错误。这是我的解决方案:

    for row in reader:
        if len(row) > 2:
            array.append(row[3])

你能格式化你的回答吗? - Mathews Sunny
1
非常感谢您的回答!len()真是救命稻草。 - lmao

1
我以前也遇到过这个错误。我的问题很愚蠢,本可避免。我从另一个程序中复制了一些代码,并没有更改分隔符(在我的情况下是从管道符改为逗号),因此当没有管道符存在时,它会超出其索引寻找管道符。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接