我正在尝试在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:列表索引超出范围
有谁知道为什么我会收到此错误消息以及如何更正?
答案 0 :(得分: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'
与{{1 }})。
第三,如果您想选择字符串的一部分直到分隔符(例如逗号),请使用.split(delimiter, 1)
或.partition(delimiter)[0]
:
1
答案 1 :(得分: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