【问题标题】:List Index Out of Range when accessing row read from CSV file访问从 CSV 文件读取的行时列出索引超出范围
【发布时间】:2012-10-14 19:36:34
【问题描述】:

我正在尝试在 python 中读取一个 csv 文件。 csv 文件有 1400 行。我使用以下命令打开了 csv 文件:

import csv  
import sys             
f=csv.reader(open("/Users/Brian/Desktop/timesheets_9_1to10_5small.csv","rU"),
    dialect=csv.excel_tab)

然后我尝试使用以下命令遍历文件以从每一行中提取名字:

for row in f:
    g=row
    s=g[0]  
    end_of_first_name=s.find(",")
    first_name=s[0:end_of_first_name]

我收到以下错误消息:

回溯(最近一次通话最后一次):
文件“”,第 3 行,在模块中
s=g[0]
IndexError: 列表索引超出范围

有谁知道我为什么会收到此错误消息以及如何更正它?

【问题讨论】:

  • 您是否尝试在循环中添加print row 以查看它认为的行是什么?其中一个(可能在最后)是空的。顺便说一句,我不明白你的end_of_first_name 逻辑(除非我刚刚想到,那里有多个名字,并且“第一”你不是指“约翰史密斯”中的“约翰”,你的意思是“约翰”在“约翰,弗雷德”中。)
  • 我敢打赌,如果你执行 len(g),它会返回 0。听起来你有一个空行。
  • 好主意。我添加了一个打印行,并意识到代码在 csv 文件中的一行深处存在问题。我将尝试找出为什么该行很麻烦。谢谢!

标签: python csv python-2.7


【解决方案1】:

您应该以通用换行模式 (U) 打开文件。改为以二进制模式打开文件:

f=csv.reader(open("/Users/Brian/Desktop/timesheets_9_1to10_5small.csv","rb"),
    dialect=csv.excel_tab)

CSV 自己处理换行符,包括管理引号中的换行符。

接下来,使用print repr(row) 打印您的行,以验证您是否获得了预期的输出。使用repr 而不是常规的字符串表示可以向您展示更多关于您正在处理的对象的类型,突出显示字符串与整数等差异('1'1)。 p>

第三,如果要选择字符串的一部分直到逗号等分隔符,请使用.split(delimiter, 1).partition(delimiter)[0]

>>> 'John,Jack,Jill'.partition(',')[0]
'John'

【讨论】:

  • 感谢您如此迅速地回复。我尝试以二进制模式 (rb) 打开它并收到以下错误消息 Error: new-line character seen in unquoted field - 你需要以通用换行模式打开文件吗?我使用了 print repr(row) 技术,并意识到代码在 csv 文件的深处有问题。我将尝试找出为什么该行很麻烦。谢谢!
  • @user1744871:是的,csv 模块中似乎存在错误;看到Python and csv help很高兴我的repr()技巧帮助了你。
【解决方案2】:

row 和 g 指向一个空列表。我不知道这是否一定意味着它是文件中的空行,因为 csv 可能有其他问题。

line_counter = 0
for row in f:
    line_counter = line_counter + 1
    g=row
    if len(g) == 0:
        print "line",line_counter,"may be empty or malformed"
        continue

或者,正如 Martijn 指出的那样,Pythonic 方式是使用枚举:

for line_counter, row in enumerate(f,start=1):
    g=row
    if len(g) == 0:
        print "line",line_counter,"may be empty or malformed"
        continue

【讨论】:

  • 使用for line_counter, row in enumerate(f): 而不是显式计数器。
  • 这是处理中断条件的好方法。感谢您的回复。
猜你喜欢
  • 2019-12-11
  • 2015-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-23
  • 2023-02-24
  • 2022-01-17
  • 2014-08-20
相关资源
最近更新 更多