2012-07-27 46 views
4

我常常不讀它閱讀後沒有關閉文件有什麼缺點嗎?

for line in open(FileName): 
    # do something 

我也以同樣的程序再次重新打開該文件後,關閉文件。

for line in open(FileName): 
    # do something else 

我的問題是這種方法是否有任何缺點? 我已經看到,聲稱文件應該是開放與with

with open(FileName) as fp: 

但職位是什麼這種方法的優勢在哪裏?

回答

4

在某些情況下,您可能會在沒有遇到不利影響的情況下關閉文件。當使用for line in open("filename"):時,CPython(最流行的Python實現)將在循環之後立即關閉文件,前提是不存在對文件的進一步引用。在其他Python實現中,關閉文件可能會延遲,但最終會被關閉。

有幾個問題,雖然:

  1. 到一個文件中有時隱藏引用繼續存在。如果在函數中拋出異常,與異常相關的回溯包含對函數執行fram的引用,所以所有局部變量都會繼續存在 - 這可能會使文件在CPython中的打開時間超過預期。

  2. 打開許多文件時,您可能會耗盡文件描述符,因爲您無法控制它們再次關閉的時間。

  3. 對於沒有關閉的每個文件,Python 3.2或更高版本都會產生ResourceWarning(但可以禁用此警告)。

總之,這根本不值得麻煩。總是使用with,並忘記這些問題。無論如何,在琢磨時還是要記住。

+1

謝謝。我最喜歡你的最後一行。 – imsc 2012-07-27 11:21:58

+0

重發#1:在異常期間,受到'with'語句保護的開放文件,局部變量,堆棧幀中會發生什麼? – thebjorn 2012-07-27 11:47:31

+0

@thebjorn:在堆棧展開期間,在執行'with'塊的任何異常處理程序* outside *之前,它會被關閉。 – 2012-07-27 11:49:09

0

重新使用with

開放的主要優勢/使用with管理文件的是,他們是在退出「塊」與with assocated 自動關閉你。如果遇到例外,該文件也會關閉。

離開文件未關閉是不整潔的編程。

注意,尤其是在文件的情況下,你是來,你可能不會得到所有自動發生在你的輸出文件,因爲未封閉的文件可能並沒有全部刷新其緩衝區的預期(數據作爲關閉文件的一部分),導致只有部分輸出文件。

因此,雖然您不必使用with來打開文件,但它確實可以更輕鬆地管理它們,並且還可以關閉文件,即減少一件讓您擔心的事情,這就是爲什麼建議。