我目前正在开发一个在python中使用csv模块的项目.我创建了一个单独的类来打开预先存在的csv文件,修改每行上的数据,然后将数据保存到新的csv文件中.
原始文件有1438行,通过将一些测试代码放入处理写入的类中,它表示它正在向新的csv文件写入1438行.在检查文件本身时,新创建的文件中实际上有1438行.但是,当我以这种方式使用标准cvs模块时:
reader = csv.reader(open('naiveData.csv', 'rb'))
Run Code Online (Sandbox Code Playgroud)
它只进入第1410行(甚至不是整行,它在行结束前结束了一个半的索引.我不确定是什么原因造成的.
这就是我访问读者的方式:
for row in reader:
print row
Run Code Online (Sandbox Code Playgroud)
以下是输出失败的部分:
['UNPM', '16', '2.125', '910', 'athlete', 'enrolled']
['UNPM', '14', '2.357', '1020', 'non-athlete', 'enrolled']
['UNDC', '17', '2.071', '910', 'athlete', 'unenrolled']
['KINS', '15', '2.6', '910', 'athlete', 'enrolled']
['PHYS', '16', '1.5', '900', 'non-']
Run Code Online (Sandbox Code Playgroud)
最后一个列表应该有['PHYS','16','1.5','900','非运动员','登记'].
关于可能导致这种情况的任何想法?提前致谢!
编辑:
以下是错误发生区域周围CVS文件中的行:
KINS,15,2.6,910,athlete,enrolled
PHYS,16,1.5,900,non-athlete,enrolled
UNPL,15,3,960,non-athlete,enrolled
Run Code Online (Sandbox Code Playgroud)
我愿意打赌这是问题所在,虽然很难确定你何时只向我们展示了3行代码而不是可重复的例子.
你正在做这样的事情:
old_reader = csv.reader(open('old.csv', 'rb'))
writer = csv.writer(open('new.csv', 'wb'))
for row in old_reader:
writer.writerow(transform(row))
new_reader = csv.reader(open('new.csv', 'rb'))
for row in new_reader:
print row
Run Code Online (Sandbox Code Playgroud)
在您打开new.csv阅读时,您还没有结束new.csv写作.因此,最后一个缓冲区尚未刷新到磁盘.所以你看不到它.
但是,当您的脚本完成时,writer超出范围,文件对象不再具有任何引用,因此它将被刷新并关闭.因此,当您从程序外部检查它时,脚本完成后,现在它已完成.(请注意,此行为明确无法保证;您只是幸运.)
这就是为什么你不应该只是open在表达式的中间放置文件.请改用with声明.例如:
with open('old.csv', 'rb') as oldf, open('new.csv', 'wb') as newf:
old_reader = csv.reader(oldf)
writer = csv.writer(newt)
for row in old_reader:
writer.writerow(transform(row))
with open('new.csv', 'rb') as newf:
new_reader = csv.reader(newf)
for row in new_reader:
print row
Run Code Online (Sandbox Code Playgroud)