【问题标题】:I get IndexError when looping lines of a file循环文件行时出现 IndexError
【发布时间】:2015-10-02 11:32:20
【问题描述】:

我对 Python 还是很陌生,只是不明白这里出了什么问题。

我在从 CSV 文件读取行的中间得到一个 IndexError: list index out of range。该文件有约 135k 行数据。在代码处理完第 38.715 行后,我收到上述带有 print 函数的代码行的错误。我不明白是什么原因造成的,因为在那之前的任何行都没有问题,并且数据的结构或类型没有改变。我在 VMware btw 中运行 Ubuntu 14.04(64 位)。

注意:str(int(row[2])) 只是为了删除前面的 0,以便之后我可以将该字符串与另一个字符串进行比较。

这是我的代码:

import csv
with open('/home/joakim/Desktop/SomeFile.csv', 'r') as f_id:
    f_reader = csv.reader(f_id, delimiter=';')
    for row in f_reader:
        print ('C.id:', row[0], 'PR.id:', row[1], 'Id:', str(int(row[2])))

谁能指出我的方向?

【问题讨论】:

  • 我猜有些行格式错误 - 没有 3 个 csv 列,因此当您尝试访问第三列时会引发异常。你能验证 row 对象在引发异常时在迭代中的外观吗?
  • 我检查了正在读取的文件中的第 38.715 行和第 38.716 行,数据格式相同,分隔符相同。此外,我刚刚从 XLSX 文件中导出了 CSV 文件,所以我看不到数据是如何出现格式错误的。不过,我会尝试在进行其他打印之前打印整个行对象。
  • 尝试添加print(len(row)) 以确认这一点。
  • @MartinEvans 或if len(row) < 3: print row
  • @Łukasz R. Lol,我是个白痴! :P 感谢您的回答,我刚刚找到了罪魁祸首。显然,当我将文件从主机操作系统复制到 VMware 时,它​​并没有复制文件中的所有数据。我正在查看位于主机操作系统中的文件是否有错误:P 非常感谢!

标签: python list python-3.x for-loop file-io


【解决方案1】:

实际上,变量行的任何索引中都存在空值或NULL。

你可以使用:

row[0] or ""
row[1] or ""
row[2] or ""

【讨论】:

  • 感谢您的回答,学习新东西总是好的 :-)
【解决方案2】:

根据 cmets,问题是由于一行没有请求打印的所有元素。

在 python 中,使用 try 和 except 块进行错误处理是很常见的,并且经常被鼓励使用。

例如,在您的情况下,以下内容可以帮助您找到有问题的行

import sys
...
    try:
        print(...,row[2])
    except IndexError:
        printf("Error: missing element(s) in row: ",row,file=sys.stderr)
        # sys.exit(2) # if you want to exit program with error 

【讨论】:

  • 感谢您的回答 - 我发现我的 VM 中的文件副本丢失了数据,我正在寻找主机操作系统中的文件中的错误。这就是为什么它对我来说毫无意义:P
【解决方案3】:

因此,显然当我将文件从主机操作系统复制到 VMware 时,它​​并没有复制文件中的所有数据。我错误地在位于主机操作系统的文件中查找错误,而不是在我复制到来宾操作系统的文件中查找错误。

所以答案是:我不得不再次将文件复制到客户操作系统并检查所有数据是否都在那里。

感谢 cmets - 让我找到了答案!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-01-03
    • 1970-01-01
    • 2016-12-09
    • 1970-01-01
    • 2014-06-25
    • 2019-09-08
    • 1970-01-01
    • 2014-11-27
    相关资源
    最近更新 更多