[英]is it necessary to call flush method of file handler in python
我看到他們使用file.flush()的代碼。 所以,我搜索周圍,發現這個SO帖子 。 我有點理解為什么有一個flush方法。 在標記為答案的答案中寫了以下內容
通常情況下,您不需要為任何一種方法而煩惱,但是如果您處於一種偏執,關於實際上最終存在於磁盤上的內容是一件好事,您應該按照指示進行兩次調用。
所以,我想知道,當我們使用上下文管理器打開文件並編寫一些文本時,然后當代碼退出此上下文管理器時,文本可能沒有被寫入文件? 如果是的話,為什么python在調用file.close()時不會在內部執行此操作? 它已經完成了嗎?
io
模塊中的文件對象(你從open
的文件對象)和stdlib中你期望的其他地方的文件對象在close
時總是flush
,或者依賴於保證這樣做的平台API。
即使是第三方庫,如果他們希望他們的對象是文件對象,也需要在他們的close
方法上“關閉並刷新流”。 1
調用flush
主要原因是當你還沒有關閉文件時,但是其他一些程序可能想看到內容。
例如,很多人編寫如下代碼:
with open('dump.txt', 'w') as f:
while True:
buf = read_off_some_thingy()
f.write(buf.decode())
time.sleep(5)
...然后他們想知道為什么當他們cat dump.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
,這是一個完整的問題 - 而且比大多數人的事情要復雜得多 - 所以我不會深入研究它。 但是您鏈接的問題已經涵蓋了基礎知識。
1.你總是有可能使用一些第三方庫和一個類似文件的對象,這些對象可以根據你的需要與文件對象足夠接近,但不是一個。 而這種類型可能有一個不flush
的close
。 但老實說,我不認為我曾經見過一個具有flush
方法的對象,它沒有在關閉時調用它。
Python在.close()
d時會刷新文件,這會在退出上下文管理器時發生。
鏈接的帖子更多地指的是您擁有一個長時間打開的日志文件的場景,並且您希望確保在每次寫入后所有內容都寫入磁盤。 這就是你想要的地方.write(); .flush();
.write(); .flush();
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.