Python CSVWriter在我写入数据时未将数据保存到文件

Python CSVWriter在我写入数据时未将数据保存到文件,python,csv,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

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])
文件myfile.csv已成功创建,但它是空的,但有一个锁,因为Python进程仍在使用它。数据似乎已写入内存中的文件,但尚未刷新到磁盘

由于Python进程持有文件的锁,因此我假设我负责释放锁。以下是我的问题:

  • 如何让python刷新到磁盘
  • 如何关闭在csv.writer()方法中打开的文件
  • flush()
    close()
    方法。或者将
    一起使用

    使用

    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
    

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


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

    但我正在创建一个“匿名”文件对象-因此我没有任何可调用的刷新和关闭。除非我弄错了,否则这意味着在将文件对象传递给csv.writer()函数之前,我必须稍微修改代码以首先清除文件对象。然后,我可以按照您的建议对file对象调用flush()和close()。如果是这样的话,那么在的文档确实是无用的/误导性的,因为我认为它是,我将永远不会再参考它。在这里工作很好。Windows正在做的事情可能有点疯狂,“但我正在创建一个‘匿名’文件对象”。不要。为了@skyeagle的信誉,他链接的文档中的许多示例都是这样做的。我会说,这是不和谐的(“显式比隐式好”),但我不会承担再也不看文档的后果@蒂姆:看到我的观点,我不得不给你打+1分:)。关于不再看Python文档,一旦“红色迷雾”平息,我会没事的……)“如果我自己编写文件解析器会更容易”-我将在“著名的遗言”下对其进行归档。主要的直觉是,在写入csv编写器后,文件句柄仍然是打开的。如果您删除外部的“打开”调用并维护一个单独的文件句柄,并将其传递到csv.writer(csvFile,…)中,则可以在完成后关闭该文件句柄,它将刷新。Tim提供的答案解释了一些很好的方法。csvwriter缺少一个flush方法,这是一个疏忽。我看到有一个
    file.synch()
    方法。我想知道这与
    flush
    命令有何不同。我不会在每个迭代步骤中
    flush()
    ,因为在迭代过程中不需要对行中的行监控文件内容在那命令之后的评论中。@Tim我明白你的意思。只是想让其他人明白:)。如果这是一个新手问题,很抱歉,但要将内容写入磁盘,是否必须显式刷新?还是CSV编写器会自动执行此操作?我知道有一个
    file.sync()
    函数。这和法拉盛不同吗?“我在这一点上有点困惑。@CharlieParker不,您不需要显式刷新您正在写入的内容以确保它在磁盘上。通常情况下,为了节省计算量,您的程序会在实际执行之前建立一个信息缓冲区以供编写。Flushing基本上是说“现在编写缓冲区,而不是以后编写”。
    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.