一.文件操作: open寫法
1.文件操作說明:
①文件使用完后必須關(guān)閉。
②因文件對象會占用操作系統(tǒng)的資源,并且操作系統(tǒng)同一時間能打開的文件數(shù)量也是有限的。
例如:?
# 1.以寫的方式打開文件
f = open('python.txt', 'w', encoding = 'utf-8')
# 2.寫入文件內(nèi)容
f.write('人生苦短,我學(xué)python!!')
# 3.關(guān)閉文件
f.close()
2. 存在的安全隱患:
① 由于文件讀寫時都有可能產(chǎn)生IOError,一旦出錯,后面的f.close()就不會調(diào)用。
例如:
# 1.以讀的方式打開文件
f = open('python.txt', 'r', encoding = 'utf-8')
# 2.寫入文件內(nèi)容
f.read()
# 3.關(guān)閉文件
f.close()
運行結(jié)果:
3.try…except…finally解決文件操作異常:
①為了保證無論是否出錯都能正確地關(guān)閉文件,我們可以使用try ... finally來解決。?
②但是,try-except-finally語句缺點:代碼過于冗長, 不易用,易忘。
例如:
try:
# 1.嘗試執(zhí)行的代碼
f = open("python.txt", 'r', encoding='utf-8')
print(f.read())
except IOError as e:
# 2.出問題后的解決方案, 文件不存在就創(chuàng)建
f = open("python.txt", 'w', encoding='utf-8')
finally:
# 3.釋放資源.
f.close()
二.with語句
1.上下文管理器with語句:
該機制簡單、更安全的處理資源和異常。
2.特點:
with 語句執(zhí)行完成后,自動調(diào)用關(guān)閉文件操作,即使出現(xiàn)異常也會自動調(diào)用關(guān)閉文件操作。
# 1、以寫的方式打開文件
with open("python.txt", "w", encoding='utf-8') as f:
# 2、讀取文件內(nèi)容
f.write("人生苦短,我學(xué)python!!")
三.上下文管理器原理
1.概述:
一個類只要實現(xiàn)了__enter__()和__exit__()這個兩個方法,通過該類創(chuàng)建的對象我們就稱之為上下文管理器。
2.原理:
上下文管理器可以使用 with 語句,with語句之所以這么強大,背后是由上下文管理器做支撐的。 剛才使用 open 函數(shù)創(chuàng)建的文件對象就是就是一個上下文管理器對象。 ?
大白話:with 管理的對象就是上下文管理器, with xxx as 后面的操作的對象就是被管理的對象。
例如:
# 1. 自定義上下文管理器類.
class MyFile:
# 2. 重寫 __init__()魔法方法, 初始化: file_name(文件名), file_model(文件模型)
def __init__(self, file_name, file_model):
"""
初始化屬性的.
:param file_name: 文件名
:param file_model: 文件(操作)模型, r:只讀, w:只寫, a:追加
"""
self.file_name = file_name
self.file_model = file_model
self.fp = None # fp代表的文件對象.
# 3. 重寫 __enter__()函數(shù), 表示: 上文. 即: with語句執(zhí)行前, 做的事兒.
def __enter__(self):
print('這個是上文, 初始化屬性的!')
self.fp = open(self.file_name, self.file_model, encoding='utf-8')
return self.fp # fp就是文件對象.
# 4. 重寫 __exit__()函數(shù), 表示: 下文, 即: with語句執(zhí)行完畢后, 做的事兒.
def __exit__(self, exc_type, exc_val, exc_tb): # 這些參數(shù)一個也用不到
print('這個是下文, 釋放資源的!')
self.fp.close()
# # 5. 演示with open()語法, __enter__()返回的是: 文件對象
with MyFile('./1.txt', 'r') as fp: # fp就是上邊的 fp屬性, 代表這文件對象.
# 這里的內(nèi)容執(zhí)行完畢后, 會被自動釋放資源.
print('123')
print(fp.read())
運行結(jié)果文章來源:http://www.zghlxwxcb.cn/news/detail-763673.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-763673.html
3.技術(shù)細節(jié)
- 一個類只要實現(xiàn)了__enter__()和__exit__()這個兩個方法,通過該類創(chuàng)建的對象我們就稱之為上下文管理器
- _enter__表示上文方法,需要返回一個操作文件對象
- __exit__表示下文方法,with語句執(zhí)行完成會自動執(zhí)行,即使出現(xiàn)異常也會執(zhí)行該方法
到了這里,關(guān)于Python高級語法:with語句和上下文管理器的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!