2010-03-08 120 views

回答

17

應該關閉文件句柄在文件的__del__聲明,但更好的方法是使用一個with塊:

def read_contents(file_path): 
    with open(file_path, 'r') as f: 
    return f.read() 

更多信息請參見http://docs.python.org/library/stdtypes.html#file.close

+0

只需提一下:文件返回一個具有close方法的文件對象。這將是最直接的解決方案,但「與」顯然是更好的解決方案。 – Achim 2010-03-08 20:26:47

+0

我有一個問題 - 我的Python中沒有'with'。未來可以導入嗎?我有Python 2.5。 – bodacydo 2010-03-08 20:29:37

+0

如果你有Python 2.5,那麼是的。 – 2010-03-08 20:30:15

28

要展開FogleBird的回答,如果您沒有明確地關閉它,那麼當文件對象被銷燬時,文件將自動關閉。在CPython中,只要沒有更多的引用就會發生,例如如果它是函數中的局部變量並且函數結束。但是,如果在函數中引發異常,並且文件沒有使用with語句或try:...finally:明確地關閉,則對該文件的引用將作爲跟蹤對象中堆棧跟蹤的一部分保存,並且文件將不會關閉直到下一個異常拋出。

另外IronPython和Jython分別使用.Net CLR和Java JVM的垃圾收集工具。這些不是引用計數,所以文件將無限期地保持打開狀態,直到垃圾回收器決定回收對象的內存或程序終止。

因此,一般情況下,使用with:try:...finally:明確關閉文件非常重要。

當然,所有這些都適用於需要顯式清理的任何其他類型的對象。

+1

+1,我沒有提到的所有優點。 :) – FogleBird 2010-03-08 21:18:24

+1

「沒有打擾」 - 我不知道這一點。 :( – bodacydo 2010-03-08 22:30:34

+0

感謝提到所有這些重要的一點! – bodacydo 2010-03-08 22:30:56