帶有 「with」 關鍵字的語句,它通常用在對於系統資源如檔案
、資料庫連線
、socket
而言,應用程式開啟這些資源並執行完業務邏輯之後,必須做的一件事就是要關閉(斷開)該資源。
比如 python 程式開啟乙個檔案,往檔案中寫內容,寫完之後,就要關閉該檔案,否則會出現什麼情況呢?極端情況下會出現 「too many open files」 的錯誤,因為系統允許你開啟的最大檔案數量是有限的。
同樣,對於資料庫,如果連線數過多而沒有及時關閉的話,就可能會出現 「can not connect to mysql server too many connections」,因為資料庫連線是一種非常昂貴的資源,不可能無限制的被建立。
來看看如何正確關閉乙個檔案。
普通版:
defm1(
):f =
open
("output.txt"
,"w"
) f.write(
"python之禪"
) f.close(
)
這樣寫有乙個潛在的問題,如果在呼叫 write 的過程中,出現了異常進而導致後續**無法繼續執行,close 方法無法被正常呼叫,因此資源就會一直被該程式占用者釋放。那麼該如何改進**呢?
高階版:
defm2(
):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 **中,檔案就一定會關閉。
高階版(with):
defm3(
):with
open
("output.txt"
,"r"
)as f:
f.write(
"python之禪"
)# 在ipython裡,import this
一種更加簡潔、優雅的方式就是用 with 關鍵字。open 方法的返回值賦值給變數 f,當離開 with **塊的時候,系統會自動呼叫f.close() 方法, with 的作用和使用 try/finally 語句是一樣的。那麼它的實現原理是什麼?在講 with 的原理前要涉及到另外乙個概念,就是上下文管理器(context manager)。
任何實現了__enter__()
和__exit__()
方法的物件都可稱之為上下文管理器,上下文管理器物件可以使用 with 關鍵字。顯然,檔案(file)物件也實現了上下文管理器。
那麼檔案物件是如何實現這兩個方法的呢?我們可以模擬實現乙個自己的檔案類,讓該類實現__enter__()
和__exit__()
方法。
class
file()
: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 語句了。
with file(
'out.txt'
,'w'
)as f:
print
("writing"
) f.write(
'hello, python'
)
這樣,你就無需顯示地呼叫 close 方法了,由系統自動去呼叫,哪怕中間遇到異常 close 方法也會被呼叫。
python 還提供了乙個contextmanager的裝飾器,更進一步簡化了上下文管理器的實現方式。通過yield將函式分割成兩部分,yield之前的語句在__enter__
方法中執行,yield之後的語句在__exit__
方法中執行。緊跟在 yield 後面的值是函式的返回值。
from contextlib import contextmanager
@contextmanager
defmy_open
(path, mode)
: f =
open
(path, mode)
yield f
f.close(
)
呼叫
with my_open('out.txt', 'w') as f:
f.write("hello , the ******st context manager")
python 提供了 with 語法用於簡化資源操作的後續清除操作,是 try/finally 的替代方法,實現原理建立在上下文管理器之上。此外,python 還提供了乙個 contextmanager 裝飾器,更進一步簡化上下管理器的實現方式。 Python的檔案操作
1.open使用open開啟檔案後一定要記得呼叫檔案物件的close 方法。比如可以用try finally語句來確保最後能關閉檔案。file object open thefile.txt try all the text file object.read finally file object....
Python的檔案操作
python中對檔案 資料夾 檔案操作函式 的操作需要涉及到os模組和shutil模組。一 1.得到當前工作目錄,即當前python指令碼工作的目錄路徑 os.getcwd 2.返回指定目錄下的所有檔案和目錄名 os.listdir 3.函式用來刪除乙個檔案 os.remove 4.刪除多個目錄 o...
python的檔案操作
toc 開啟檔案的模式有 1.唯讀模式 預設 2.只寫模式 不可讀,不存在則建立,存在則覆蓋 3.追加模式 可讀,不存在則建立,存在則只追加內容 表示可同時讀寫某個檔案 1.r 可讀寫檔案 可讀,可寫,可追加 2.w 寫讀 3.a 追加 b 表示處理二進位制檔案 1.rb 2.wb 3.ab 序號方...