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

Mar*_*n K 25 python operating-system file

我正在运行测试,发现该文件实际上没有写入,直到我控制-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)
Run Code Online (Sandbox Code Playgroud)

Kat*_*iel 68

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

当你写入文件时,你实际上是在写入内存中的"缓冲区".当它填满时,Python会自动将其写入磁盘.您可以告诉它"将缓冲区中的所有内容写入磁盘"

f.flush()
Run Code Online (Sandbox Code Playgroud)

这不是全部,因为操作系统也可能缓冲写入.你可以告诉用文件写缓冲区

os.fsync(f.fileno())
Run Code Online (Sandbox Code Playgroud)

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

  • 请注意,无偿的`fsync()是带有旋转磁盘驱动器的笔记本电脑的人的祸根,他们关心电池寿命.您不需要调用`fsync()`来使内容对其他程序可见; 在意外重启后,它更接近可见性(尽管它不一定是充足的条件). (4认同)
  • @MarcoSulla,“fsync()”从块缓存同步到磁盘,但块缓存也与其他程序共享。 (2认同)
  • @MarcoSulla,...因此,只要您成功完成了 `write()` 系统调用 - `flush()` 保证 - 内容会被操作系统识别并可供其他软件使用. 唯一的例外是共享(网络)文件系统。 (2认同)

dee*_*392 5

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

别忘了import os.

  • 不是一直到磁盘,但如果它对其他程序可见,那就是他在这里要求的.os.fsync()很昂贵,除非你_really_知道你想要它(并且通常有一种让用户关闭它的方法),否则不应该使用它.请注意,即使大多数数据库都有一种方法可以禁用fsync - 有时用户*希望*冒险数据损坏以使事情变得更快. (2认同)