1. 程式人生 > >Python 檔案操作 - 建立上下文管理器

Python 檔案操作 - 建立上下文管理器

上下文管理器,通俗的介紹就是:在程式碼塊執行前,先進行準備工作;在程式碼塊執行完成後,做收尾的處理工作。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()

比較繁瑣吧?所以說使用上下文管理器的好處就是,通過呼叫我們預先設定好的回撥,自動幫我們處理程式碼塊開始執行和執行完畢時的工作。而通過自定義類的enterexit方法,我們可以自定義一個上下文管理器。

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語句會丟擲一個對應的錯誤。