1

我正在尝试在 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]

我收到以下错误消息:

Traceback(最近一次调用最后一次):
文件“”,第 3 行,模块
s=g[0]
IndexError: list index out of range

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

4

2 回答 2

3

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

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

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

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

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

>>> 'John,Jack,Jill'.partition(',')[0]
'John'
于 2012-10-14T19:49:23.253 回答
0

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
于 2012-10-14T19:58:06.397 回答