Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/361.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中是否需要调用文件处理程序的flush方法_Python_File_Flush - Fatal编程技术网

在python中是否需要调用文件处理程序的flush方法

在python中是否需要调用文件处理程序的flush方法,python,file,flush,Python,File,Flush,我在他们使用file.flush()的地方看到了一段代码。于是,我四处寻找,找到了。我有点理解为什么会有一种冲洗法。在标记为答案的答案中,写了以下内容 通常,您不需要为这两种方法费心,但如果您处于这样一种场景中,对磁盘上的实际结果抱有妄想是一件好事,那么您应该按照指示进行两次调用 所以,我想知道,当我们使用上下文管理器打开一个文件并编写一些文本,然后当代码从此上下文管理器中退出时,是否有可能文本没有写入该文件?如果是,为什么python在调用file.close()时不在内部执行此操作?已经完成

我在他们使用file.flush()的地方看到了一段代码。于是,我四处寻找,找到了。我有点理解为什么会有一种冲洗法。在标记为答案的答案中,写了以下内容

通常,您不需要为这两种方法费心,但如果您处于这样一种场景中,对磁盘上的实际结果抱有妄想是一件好事,那么您应该按照指示进行两次调用

所以,我想知道,当我们使用上下文管理器打开一个文件并编写一些文本,然后当代码从此上下文管理器中退出时,是否有可能文本没有写入该文件?如果是,为什么python在调用file.close()时不在内部执行此操作?已经完成了吗

Python会在文件为
.close()
d时刷新文件,这是在退出上下文管理器时发生的


链接文章更多地指的是这样一种场景:例如,您有一个打开很长时间的日志文件,并且希望确保每次写入后都将所有内容写入磁盘。这就是您想要
.write()。冲洗()

io
模块中的文件对象(您从
打开
中获得的文件对象)以及在stdlib中的任何其他地方,当它们
关闭时总是
刷新
,或者依赖于保证这样做的平台API

如果第三方库希望它们的对象是文件对象,那么即使它们的方法也需要“关闭并刷新流”。1


调用
flush
的主要原因是当您还没有关闭文件时,但是其他一些程序可能想要查看内容


例如,许多人编写的代码如下:

with open('dump.txt', 'w') as f:
    while True:
        buf = read_off_some_thingy()
        f.write(buf.decode())
        time.sleep(5)

……然后他们想知道为什么当代码> CAT转储。TXT < /代码>或在记事本中打开它或其他什么东西,它是空的,或者丢失最后3行,或者在中间行切断。这就是

flush
解决的问题:

with open('dump.txt', 'w') as f:
    while True:
        buf = read_off_some_thingy()
        f.write(buf.decode())
        f.flush()
        time.sleep(5)

或者,它们运行的是相同的代码,但问题是有人可能会拔掉计算机上的插头(或者,现在更可能的情况是,杀死您的容器),然后在重新启动后,它们会有一个损坏的文件,中途中断,现在扫描输出的perl脚本将无法运行,没有人想调试perl代码。不同的问题,相同的解决方案


但是,如果您知道文件将在某个点关闭(例如,因为有一个
with
语句在该点之前结束),并且您不需要在该点之前完成文件,则不需要调用
flush


你没有提到
fsync,这是一个完全不同的问题,而且比大多数人的事情要复杂得多,所以我就不谈了。但你链接的问题已经涵盖了基本内容



一,。您总是有可能在使用某个第三方库时使用类似文件的对象,该对象的类型与您需要的文件对象足够接近,但并非如此。这种类型可能有一个
close
,它不会
flush
。但老实说,我从来没有见过有
flush
方法的对象,它没有在关闭时调用它。

从另一篇文章中,我了解到fsync会将操作系统缓冲区转储到磁盘。比这更复杂吗?我能想到的另一种情况是,当人们只使用file.open(file_name)并添加所有数据时,却忘记关闭文件@是的,因为“到磁盘”是什么意思?它实际上是在等待物理编码到磁性或光学或任何数据上吗?即使操作系统认为是这样,许多磁盘接口仍然存在(因为它改进了它们的基准测试)。macOS提供了一个特殊的
F_FULLSYNC
(通常)来解决这个问题,但默认情况下不会发生;有些linux文件系统总是这样做,有些则不然;等等,解决方法并不总是有效的。如果“磁盘”实际上是网络共享呢?依此类推。@InAFlash是的,这确实发生了,这就是为什么
with
被添加到语言中的原因。但是当你这样做的时候,你通常不会调用
flush
…@InAFlash,而且…我找不到它,但是有一个线程关于linux文件系统在提交日志条目时是否可以从fsync返回,如果有人拔掉插头,它几乎肯定可以用来恢复和重放写操作,或者仅当它提交到主存储器时。