reference:
來看看如何正確關閉乙個檔案。
普通版:
def m1():
f = open("output.txt", "w")
f.write("python之禪")
f.close()
這樣寫有乙個潛在的問題,如果在呼叫 write 的過程中,出現了異常進而導致後續**無法繼續執行,close 方法無法被正常呼叫,因此資源就會一直被該程式占用而無法被釋放。那麼該如何改進**呢?
高階版:
def m2():
f = open("output.txt", "w")
try:
f.write("python之禪")
except ioerror:
print("oops error")
finally:
f.close()
改良版本的程式是對可能發生異常的**處進行 try 捕獲,使用 try/finally 語句,該語句表示如果在 try **塊中程式出現了異常,後續**就不再執行,而直接跳轉到 except **塊。而無論如何,finally 塊的**最終都會被執行。因此,只要把 close 放在 finally **中,檔案就一定會關閉。
高階版:
def m3():
with open("output.txt", "w") as f:
f.write("python之禪")
一種更加簡潔、優雅的方式就是用 with 關鍵字。open 方法的返回值賦值給變數 f,當離開 with **塊的時候,系統會自動呼叫 f.close() 方法, with 的作用和使用 try/finally 語句是一樣的。那麼它的實現原理是什麼?在講 with 的原理前要涉及到另外乙個概念,就是上下文管理器(context manager)。
上下文管理器
任何實現了 __enter__() 和 __exit__() 方法的物件都可稱之為上下文管理器,上下文管理器物件可以使用 with 關鍵字。顯然,檔案(file)物件也實現了上下文管理器。
那麼檔案物件是如何實現這兩個方法的呢?我們可以模擬實現乙個自己的檔案類,讓該類實現 __enter__() 和 __exit__() 方法。
classview codefile():
def__init__
(self, filename, mode):
self.filename =filename
self.mode =mode
def__enter__
(self):
print("
entering")
self.f =open(self.filename, self.mode)
return
self.f
def__exit__(self, *args):
print("
will exit")
self.f.close()
__enter__() 方法返回資源物件,這裡就是你將要開啟的那個檔案物件,__exit__() 方法處理一些清除工作。
因為 file 類實現了上下文管理器,現在就可以使用 with 語句了。
classview codefile():
def__init__
(self, filename, mode):
self.filename =filename
self.mode =mode
def__enter__
(self):
print("
entering")
self.f =open(self.filename, self.mode)
return self.f #
這個返回值賦值給了as 後面的變數f
def__exit__(self, *args):
print("
will exit")
self.f.close()
with file(
'out.txt
', 'w'
) as f:
print("
writing")
f.write(
'hello, python')
'''執行結果:
entering
writing
will exit
'''
這樣,你就無需顯示地呼叫 close 方法了,由系統自動去呼叫,哪怕中間遇到異常 close 方法也會被呼叫。
python 上下文管理器
上下文管理器允許你在有需要的時候,精確地分配和釋放資源。使用上下文管理器最廣泛的案例就是with語句了。想象下你有兩個需要結對執行的相關操作,然後還要在它們中間放置一段 上下文管理器就是專門讓你做這種事情的。舉個例子 with open some file w as opened file open...
python上下文管理器
上下文管理器是乙個包裝任意 塊的物件。上下文管理器保證進入上下文管理器時,每次 執行的一致性 當退出上下文管理器時,相關資源會被正確 這裡被正確 指的是在 exit 方法自定義 比如關閉資料庫游標 值得注意的是,上下文管理器一定能夠保證退出步驟的執行。如果進入上下文管理器,根據定義,一定會有退出步驟...
Python 上下文管理器
python中的上下文管理器是乙個包裝任意 塊的物件。它在處理資源的開啟關閉 異常的處理等方面有很好的實現方法。1.上下文管理器的語法 假設我們需要讀取乙個檔案中的資料,如下 try test file open test.txt r contents test file.read finally ...