簡體   English   中英

是否有必要在python中調用文件處理程序的flush方法

[英]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.你總是有可能使用一些第三方庫和一個類似文件的對象,這些對象可以根據你的需要與文件對象足夠接近,但不是一個。 而這種類型可能有一個不flushclose 但老實說,我不認為我曾經見過一個具有flush方法的對象,它沒有在關閉時調用它。

Python在.close() d時刷新文件,這會在退出上下文管理器時發生。

鏈接的帖子更多地指的是您擁有一個長時間打開的日志文件的場景,並且您希望確保在每次寫入后所有內容都寫入磁盤。 這就是你想要的地方.write(); .flush(); .write(); .flush();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM