为什么在我停止程序之前文件不会被写入?

时间:2012-03-22 14:56:44

标签: python file operating-system

我正在运行测试,发现该文件实际上没有写入,直到我控制-C来中止程序。谁能解释为什么会这样呢?

我希望它能同时写,所以我可以在过程中间读取文件。

import os
from time import sleep

f = open("log.txt", "a+")
i = 0
while True:
  f.write(str(i))
  f.write("\n")
  i += 1
  sleep(0.1)

7 个答案:

答案 0 :(得分:66)

写入磁盘的速度很慢,因此许多程序将写入存储到大块中,这些块一次性写入。这称为缓冲,Python在您打开文件时会自动执行此操作。

当您写入文件时,您实际上是在写入内存中的“缓冲区”。当它填满时,Python会自动将其写入磁盘。您可以通过

告诉它“立即将缓冲区中的所有内容写入磁盘”
f.flush()

这不是全部,因为操作系统也可能缓冲写入。您可以告诉 it 使用

编写文件的缓冲区
os.fsync(f.fileno())

最后,您可以告诉Python不要使用open(f, "w", 0)缓冲特定文件,或仅保留带open(f,"w", 1)的1行缓冲区。当然,这会减慢该文件的所有操作,因为写入速度很慢。

答案 1 :(得分:5)

您需要f.close()将文件写缓冲区刷新到文件中。或者在你的情况下,你可能只想做一个f.flush(); os.fsync();,这样你就可以继续使用打开的文件句柄循环。

不要忘记import os

答案 2 :(得分:1)

您需要查看file.flush() - 但请注意,这可能将数据写入磁盘,引用:

  

注意:   flush()不一定将文件的数据写入磁盘。使用flush()后跟os.fsync()来确保这种行为。

关闭文件(file.close())也将确保写入数据 - 使用with将隐式执行此操作,并且通常是提高可读性和清晰度的更好选择 - 更不用说解决其他问题了潜在的问题。

答案 3 :(得分:1)

你必须强制写入,所以我使用以下行来确保写入文件:

# Two commands together force the OS to store the file buffer to disc
    f.flush()
    os.fsync(f.fileno())

答案 4 :(得分:0)

这是一个Windows主义。如果您在完成文件后添加显式.close(),那么它将在当时显示在资源管理器中。即使只是冲洗它也可能就足够了(我没有方便测试的窗户盒)。但基本上f.write 实际上并没有写,它只是附加到写缓冲区 - 直到缓冲区被刷新,你才会看到它。

在unix上,在这种情况下,文件通常会显示为0字节文件。

答案 5 :(得分:0)

要刷新的文件处理程序。

f.flush()

答案 6 :(得分:0)

文件没有被写入,因为输出缓冲区在垃圾收集生效之前没有被刷新,并且刷新I / O缓冲区(更可能是通过调用f.close())。

或者,在您的循环中,您可以调用f.flush(),然后调用os.fsync(),如文档here所示。

f.flush()
os.fsync()

尽管如此,如果您计划将该文件中的数据与代码的其他部分共享,我强烈建议您使用StringIO对象。