首頁技術(shù)文章正文

with語句和上下文管理器

更新時間:2021-12-09 來源:黑馬程序員 瀏覽量:

1.with語句的使用

向文件中寫入數(shù)據(jù)的示例代碼:

 # 1、以寫的方式打開文件
 f = open("1.txt", "w") 
 # 2、寫入文件內(nèi)容
 f.write("hello world") 
 # 3、關(guān)閉文件
 f.close()
代碼說明:

文件使用完后必須關(guān)閉,因為文件對象會占用操作系統(tǒng)的資源,并且操作系統(tǒng)同一時間能打開的文件數(shù)量也是有限的這種寫法可能出現(xiàn)一定的安全隱患,錯誤代碼如下:

 # 1、以讀的方式打開文件
 f = open("1.txt", "r") 
 # 2、讀取文件內(nèi)容
 f.write("hello world") 
 # 3、關(guān)閉文件
 f.close()

運(yùn)行結(jié)果:

Traceback (most recent call last):
  File "/home/python/Desktop/test/xxf.py", line 4, in <module>
    f.write("hello world")
io.UnsupportedOperation: not writable

代碼說明:

由于文件讀寫時都有可能產(chǎn)生IOError,一旦出錯,后面的f.close()就不會調(diào)用。為了保證無論是否出錯都能正確地關(guān)閉文件,我們可以使用try ... finally來解決。

安全寫法, 代碼如下:

try:
    # 1、以讀的方式打開文件
    f = open("1.txt", "r")
    # 2、讀取文件內(nèi)容
    f.write("xxxxx")

except IOError as e:
    print("文件操作出錯", e)

finally:
    # 3、關(guān)閉文件
    f.close()

運(yùn)行結(jié)果:

文件操作出錯 not writable

這種方法雖然代碼運(yùn)行良好,但是缺點就是代碼過于冗長,并且需要添加try-except-finally語句,不是很方便,也容易忘記.

在這種情況下,Python提供了 with 語句的這種寫法,既簡單又安全,并且 with 語句執(zhí)行完成以后自動調(diào)用關(guān)閉文件操作,即使出現(xiàn)異常也會自動調(diào)用關(guān)閉文件操作。

with 語句的示例代碼:

# 1、以寫的方式打開文件
with open("1.txt", "w") as f:
    # 2、讀取文件內(nèi)容
    f.write("hello world")


2. 上下文管理器

一個類只要實現(xiàn)了__enter__()和__exit__()這個兩個方法,通過該類創(chuàng)建的對象我們就稱之為上下文管理器。

上下文管理器可以使用 with 語句,with語句之所以這么強(qiáng)大,背后是由上下文管理器做支撐的,也就是說剛才使用 open 函數(shù)創(chuàng)建的文件對象就是就是一個上下文管理器對象。

自定義上下文管理器類,模擬文件操作:

定義一個File類,實現(xiàn) __enter__() 和 __exit__()方法,然后使用 with 語句來完成操作文件, 示例代碼:

class File(object):

    # 初始化方法
    def __init__(self, file_name, file_model):
        # 定義變量保存文件名和打開模式
        self.file_name = file_name
        self.file_model = file_model

    # 上文方法
    def __enter__(self):
        print("進(jìn)入上文方法")
        # 返回文件資源
        self.file = open(self.file_name,self.file_model)
        return self.file

    # 下文方法
    def __exit__(self, exc_type, exc_val, exc_tb):
        print("進(jìn)入下文方法")
        self.file.close()


if __name__ == '__main__':

    # 使用with管理文件
    with File("1.txt", "r") as file:
        file_data = file.read()
        print(file_data)

運(yùn)行結(jié)果:

進(jìn)入上文方法
hello world
進(jìn)入下文方法

代碼說明:

  • __enter__表示上文方法,需要返回一個操作文件對象

  • __exit__表示下文方法,with語句執(zhí)行完成會自動執(zhí)行,即使出現(xiàn)異常也會執(zhí)行該方法。

IT培訓(xùn)班





猜你喜歡:

break語句語法結(jié)構(gòu)介紹

Python if判斷語句的用法詳細(xì)介紹

Scala的控制結(jié)構(gòu)語句有哪幾種?各語法格式介紹

python中if…else語句如何用?[python培訓(xùn)]

黑馬程序員Python+大數(shù)據(jù)開發(fā)培訓(xùn)

分享到:
在線咨詢 我要報名
和我們在線交談!