2010-10-20 43 views
25

Python新手对csv模块感到有些沮丧。以这样的速度,如果我自己编写文件解析器会更容易,但我想用Pythonic的方式来做事情......CSVWriter不保存数据到文件 - 为什么?

我写了一个小小的Python脚本,应该将我的数据保存到CSV文件中。

这里是我的代码片段:

import csv 

wrtr = csv.writer(open('myfile.csv','wb'),delimiter=',', quotechar='"') 

for row in rows: 
    wrtr.writerow([row.field1,row.field2,row.field3]) 

文件myfile.csv创建成功,但它是空的 - 但上有一个锁,因为它仍在使用由Python程序。看起来数据已经写入了内存中的文件,但是它还没有被刷新到磁盘。

由于Python进程正在对该文件进行锁定,因此我认为我负责释放该锁。这里是我的问题:

  1. 如何让Python刷新到磁盘
  2. 如何关闭是在csv.writer()方法打开的文件吗?
+29

“”“如果我自己写文件解析器,它会更容易”“” - 我会在“最后的词语”下面提交它。 – 2010-10-20 11:08:34

+0

主要的直觉是在你写入csv writer后文件句柄仍然是打开的。如果您在外部删除“打开”呼叫并保留一个单独的文件句柄,并将其传递到csv.writer(csvFile,...),那么您可以在完成时关闭该文件句柄并冲洗。 Tim提供的答案解释了一些很好的方法来做到这一点。 – mindthief 2011-11-15 00:06:13

+0

csvwriter缺少冲洗方法,这是一个疏忽。 – 2015-04-19 21:04:04

回答

38

使用

with open('myfile.csv','wb') as myfile: 
    wrtr = csv.writer(myfile, delimiter=',', quotechar='"') 
    for row in rows: 
     wrtr.writerow([row.field1,row.field2,row.field3]) 
     myfile.flush() # whenever you want 

myfile = open('myfile.csv','wb') 
wrtr = csv.writer(myfile, delimiter=',', quotechar='"') 
for row in rows: 
    wrtr.writerow([row.field1,row.field2,row.field3]) 
    myfile.flush() # whenever you want, and/or 
myfile.close() # when you're done. 

有关第一种方法的好处是,你的文件也将是一个异常的情况下,自动正确关闭。

如果您希望您的文件对象是匿名的,那么只有在程序退出时才会关闭它。何时或是否被刷新取决于操作系统 - 因此它可能永远不会退出。

+0

当不需要监视文件时,我不会在每个迭代步骤中使用flush()内容在行中用于行中的内容。 – 2012-05-25 08:47:49

+1

@ Jan-PhilipGehrcke:这就是为什么我在该命令后面的评论中写下“随时想要”的原因。 – 2012-05-25 09:44:01

+0

@Tim我明白你的意思。只是想让别人清楚:)。 – 2012-05-25 10:24:37

5

flush()close()方法file object。或使用with

+0

但是我正在创建一个'匿名'文件对象 - 所以我没有什么可以调用flush和close。除非我弄错了,这意味着我必须稍微修改代码才能首先清理文件对象,然后再将它传递给csv.writer()函数。然后我可以按照你的建议调用文件对象的flush()和close()。如果是这种情况,那么http://docs.python.org/library/csv.html上的文档确实像我认为的那样毫无用处/误导性,我永远不会再提及它。 – skyeagle 2010-10-20 10:18:57

+0

这里工作很好。这可能是Windows正在做的事情。 – 2010-10-20 10:22:19

+5

“但我正在创建一个'匿名'文件对象”。别。 – 2010-10-20 10:50:05

相关问题