Python基礎之with語句和上下文管理器詳解
1. with語句的使用
基礎班向文件中寫入數據的示例代碼:
# 1、以寫的方式打開文件
f = open("1.txt", "w")
# 2、寫入文件內容
f.write("hello world")
# 3、關閉文件
f.close()代碼說明:
文件使用完后必須關閉,因為文件對象會占用操作系統(tǒng)的資源,并且操作系統(tǒng)同一時間能打開的文件數量也是有限的
這種寫法可能出現一定的安全隱患,錯誤代碼如下:
# 1、以讀的方式打開文件
f = open("1.txt", "r")
# 2、讀取文件內容
f.write("hello world")
# 3、關閉文件
f.close()運行結果:
Traceback (most recent call last):
File "/home/python/Desktop/test/xxf.py", line 4, in <module>
f.write("hello world")
io.UnsupportedOperation: not writable
代碼說明:
由于文件讀寫時都有可能產生IOError,一旦出錯,后面的f.close()就不會調用。
為了保證無論是否出錯都能正確地關閉文件,我們可以使用try ... finally來解決
安全寫法, 代碼如下:
try:
# 1、以讀的方式打開文件
f = open("1.txt", "r")
# 2、讀取文件內容
f.write("xxxxx")
except IOError as e:
print("文件操作出錯", e)
finally:
# 3、關閉文件
f.close()
運行結果:
文件操作出錯 not writable
這種方法雖然代碼運行良好,但是缺點就是代碼過于冗長,并且需要添加try-except-finally語句,不是很方便,也容易忘記.
在這種情況下,Python提供了 with 語句的這種寫法,既簡單又安全,并且 with 語句執(zhí)行完成以后自動調用關閉文件操作,即使出現異常也會自動調用關閉文件操作。
with 語句的示例代碼:
# 1、以寫的方式打開文件
with open("1.txt", "w") as f:
# 2、讀取文件內容
f.write("hello world")2. 上下文管理器
一個類只要實現了__enter__()和__exit__()這個兩個方法,通過該類創(chuàng)建的對象我們就稱之為上下文管理器。
上下文管理器可以使用 with 語句,with語句之所以這么強大,背后是由上下文管理器做支撐的,也就是說剛才使用 open 函數創(chuàng)建的文件對象就是就是一個上下文管理器對象。
自定義上下文管理器類,模擬文件操作:
定義一個File類,實現 __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("進入上文方法")
# 返回文件資源
self.file = open(self.file_name,self.file_model)
return self.file
# 下文方法
def __exit__(self, exc_type, exc_val, exc_tb):
print("進入下文方法")
self.file.close()
if __name__ == '__main__':
# 使用with管理文件
with File("1.txt", "r") as file:
file_data = file.read()
print(file_data)運行結果:
進入上文方法
hello world
進入下文方法
代碼說明:
- __enter__表示上文方法,需要返回一個操作文件對象
- __exit__表示下文方法,with語句執(zhí)行完成會自動執(zhí)行,即使出現異常也會執(zhí)行該方法。
3. 上下文管理器的另外一種實現方式
假如想要讓一個函數成為上下文管理器,Python 還提供了一個 @contextmanager 的裝飾器,更進一步簡化了上下文管理器的實現方式。通過 yield 將函數分割成兩部分,yield 上面的語句在 __enter__ 方法中執(zhí)行,yield 下面的語句在 __exit__ 方法中執(zhí)行,緊跟在 yield 后面的參數是函數的返回值。
# 導入裝飾器
from contextlib import contextmanager
# 裝飾器裝飾函數,讓其稱為一個上下文管理器對象
@contextmanager
def my_open(path, mode):
try:
# 打開文件
file = open(file_name, file_mode)
# yield之前的代碼好比是上文方法
yield file
except Exception as e:
print(e)
finally:
print("over")
# yield下面的代碼好比是下文方法
file.close()
# 使用with語句
with my_open('out.txt', 'w') as f:
f.write("hello , the simplest context manager")到此這篇關于Python基礎之with語句和上下文管理器詳解的文章就介紹到這了,更多相關Python with語句 上下文管理器內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Python PyQt5中彈出子窗口解決子窗口一閃而過的問題
這篇文章主要介紹了Python PyQt5中彈出子窗口解決子窗口一閃而過的問題,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2021-03-03
Python3+selenium實現cookie免密登錄的示例代碼
這篇文章主要介紹了Python3+selenium實現cookie免密登錄的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-03-03
Python爬取OPGG上英雄聯盟英雄勝率及選取率信息的操作
這篇文章主要介紹了Python爬取OPGG上英雄聯盟英雄勝率及選取率信息的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-04-04
Python 微信之獲取好友昵稱并制作wordcloud的實例
今天小編就為大家分享一篇Python 微信之獲取好友昵稱并制作wordcloud的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-02-02

