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