Python 檔案操作 - 建立上下文管理器
阿新 • • 發佈:2018-11-08
上下文管理器,通俗的介紹就是:在程式碼塊執行前,先進行準備工作;在程式碼塊執行完成後,做收尾的處理工作。with語句常伴隨上下文管理器一起出現,經典場景有:
with open('test.txt', 'r') as file:
for line in file.readlines():
print(line)
通過with語句,程式碼完成了檔案開啟操作,並在呼叫結束,或者讀取發生異常時自動關閉檔案,即完成了檔案讀寫之後的處理工作。如果不通過上下文管理器的話,則會是這樣的程式碼:
file = open('test.txt', 'r')
try:
for line in file.readlines():
print(line)
finally:
file.close()
比較繁瑣吧?所以說使用上下文管理器的好處就是,通過呼叫我們預先設定好的回撥,自動幫我們處理程式碼塊開始執行和執行完畢時的工作。而通過自定義類的enter和exit方法,我們可以自定義一個上下文管理器。
class ReadFile(object):
def __init__(self, filename):
self.file = open(filename, 'r')
def __enter__(self) :
return self.file
def __exit__(self, type, value, traceback):
# type, value, traceback 分別代表錯誤的型別、值、追蹤棧
self.file.close()
# 返回 True 代表不丟擲錯誤
# 否則錯誤會被 with 語句丟擲
return True
然後可以以這樣的方式進行呼叫:
with ReadFile('test.txt') as file_read:
for line in file_read.readlines():
print(line)
在呼叫的時候:
1 with語句先暫存了ReadFile類的exit方法
2 然後呼叫ReadFile類的enter方法
3 enter方法開啟檔案,並將結果返回給with語句
4 上一步的結果被傳遞給file_read引數
5 在with語句內對file_read引數進行操作,讀取每一行
6 讀取完成之後,with語句呼叫之前暫存的exit方法
7 exit方法關閉了檔案
要注意的是,在exit方法內,我們關閉了檔案,但最後返回True,所以錯誤不會被with語句丟擲。否則with語句會丟擲一個對應的錯誤。