如果我這樣做,確實句柄得到自動關閉,因爲它超出範圍在Python:文件句柄在超出範圍後會在Python中自動關閉嗎?
def read_contents(file_path):
return file(file_path).read()
如果沒有,我怎麼能寫此功能自動關閉範圍是什麼?
如果我這樣做,確實句柄得到自動關閉,因爲它超出範圍在Python:文件句柄在超出範圍後會在Python中自動關閉嗎?
def read_contents(file_path):
return file(file_path).read()
如果沒有,我怎麼能寫此功能自動關閉範圍是什麼?
應該關閉文件句柄在文件的__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。
要展開FogleBird的回答,如果您沒有明確地關閉它,那麼當文件對象被銷燬時,文件將自動關閉。在CPython中,只要沒有更多的引用就會發生,例如如果它是函數中的局部變量並且函數結束。但是,如果在函數中引發異常,並且文件沒有使用with
語句或try:...finally:
明確地關閉,則對該文件的引用將作爲跟蹤對象中堆棧跟蹤的一部分保存,並且文件將不會關閉直到下一個異常拋出。
另外IronPython和Jython分別使用.Net CLR和Java JVM的垃圾收集工具。這些不是引用計數,所以文件將無限期地保持打開狀態,直到垃圾回收器決定回收對象的內存或程序終止。
因此,一般情況下,使用with:
或try:...finally:
明確關閉文件非常重要。
當然,所有這些都適用於需要顯式清理的任何其他類型的對象。
只需提一下:文件返回一個具有close方法的文件對象。這將是最直接的解決方案,但「與」顯然是更好的解決方案。 – Achim 2010-03-08 20:26:47
我有一個問題 - 我的Python中沒有'with'。未來可以導入嗎?我有Python 2.5。 – bodacydo 2010-03-08 20:29:37
如果你有Python 2.5,那麼是的。 – 2010-03-08 20:30:15