Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么文件不';在我停止程序之前我不会被写下来吗?_Python_File_Operating System - Fatal编程技术网

Python 为什么文件不';在我停止程序之前我不会被写下来吗?

Python 为什么文件不';在我停止程序之前我不会被写下来吗?,python,file,operating-system,Python,File,Operating System,我正在运行一个测试,发现在我control-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) 您需要f.close()将文件写入缓冲区刷新到文件中。或者在您的情况

我正在运行一个测试,发现在我control-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)
您需要
f.close()
将文件写入缓冲区刷新到文件中。或者在您的情况下,您可能只想执行
f.flush();os.fsync()
这样就可以继续循环打开的文件句柄


请不要忘记导入操作系统,您将要签出,但请注意,这可能不会将数据写入磁盘,请引用:

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


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

这是一个windows ism。如果在处理完文件后添加一个显式的
.close()
,它将在资源管理器中显示。即使只是冲洗一下也足够了(我手边没有一个windows测试盒)。但是基本上f.write并不是真正的写,它只是附加到写缓冲区——直到缓冲区被刷新,你才会看到它


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

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

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

这还不是全部,因为操作系统可能也会进行缓冲区写入。您可以告诉它使用

os.fsync(f.fileno())

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

要刷新的文件处理程序

f.flush()

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

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


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

您必须强制写入,因此我使用以下几行来确保文件已写入:

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

Re:“解释原因”,请参阅,但这并不能保证在没有os.fsync()的情况下完全写入磁盘。fsync()并非一直写入磁盘,但如果其他程序可以看到,这就是他在这里要求的。os.fsync()非常昂贵,除非您真的知道自己想要它,否则不应该使用它(通常,用户有办法关闭它)。请注意,即使是大多数数据库也有禁用fsync的方法——有时用户希望冒数据损坏的风险来加快速度。是的,+1。询问者还应记住操作系统之间的不同行为。请注意,免费的
fsync()
s是那些拥有旋转光盘驱动器的笔记本电脑的人的祸根,他们关心自己的电池寿命。您不需要调用
fsync()
,就可以让内容对其他程序可见;意外重启后的可见性更接近于此(尽管这也不一定是一个充分条件)。@CharlesDuffy:
您不需要调用fsync()来让内容对其他程序可见。
:为什么?我认为,如果您的程序未完成,而其他程序读取该文件,则其内容可能无法更新。@MarcoSulla,
fsync()
从块缓存同步到磁盘,但块缓存也与其他程序共享。@MarcoSulla,……因此,只要您成功地
写入()
syscall——这保证了操作系统能够识别内容,并可供其他软件使用。唯一的例外是在共享(网络)文件系统上。@MarcoSulla,……我还没有看到对上述内容的任何确认——我需要查找源代码/文档吗?
f.flush()
os.fsync()
# Two commands together force the OS to store the file buffer to disc
    f.flush()
    os.fsync(f.fileno())