CSVWriter在写入时不保存数据

sky*_*gle 34 python csv

Python新手对csv模块感到有点沮丧.按照这个速度,如果我自己编写文件解析器会更容易,但我想用Pythonic方式做事....

我写了一个小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])
Run Code Online (Sandbox Code Playgroud)

文件myfile.csv是成功创建的,但是它是空的 - 但它有一个锁定,因为它仍然被Python进程使用.似乎数据已写入内存中的文件,但尚未刷新到磁盘.

由于Python进程持有文件锁,所以我认为我负责释放锁.这是我的问题:

  1. 如何让python刷新到磁盘
  2. 如何关闭在csv.writer()方法中打开的文件?

Tim*_*ker 60

使用

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
Run Code Online (Sandbox Code Playgroud)

要么

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.
Run Code Online (Sandbox Code Playgroud)

关于第一种方法的好处是,如果出现异常,您的文件也将自动正确关闭.

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

  • @ Jan-PhilipGehrcke:这就是为什么我在该命令之后的评论中写下"随时随地". (3认同)
  • 当在迭代“for row in rows”期间不需要监视文件内容时,我不会在每个迭代步骤中“flush()”。 (2认同)

Ign*_*ams 6

flush()close()该方法的文件对象.或者使用with.

  • "但我正在创建一个'匿名'文件对象".别. (5认同)
  • 以@skyeagle为荣,他所链接的文档中的许多示例都是这样做的.这是unpythonic,我会说("明确比隐含更好"),但我不会采取从不再看文档的结果.:) (3认同)
  • 但我正在创建一个“匿名”文件对象 - 所以我没有什么可以调用刷新和关闭。除非我弄错了,否则这意味着我必须稍微修改代码以先清理文件对象,然后再将其传递给 csv.writer() 函数。然后我可以按照您的建议在文件对象上调用flush()和close()。如果是这样的话,那么 http://docs.python.org/library/csv.html 上的文档确实像我认为的那样无用/具有误导性,我永远不会再参考它。 (2认同)