with語(yǔ)句常用來(lái)處理一些事務(wù)的事先處理與事后清理工作。像文件處理時(shí)要先取得文件句柄,處理完后要關(guān)閉文件句柄
file = open('tes.txt')
data = file.read()
file.close()
這里沒(méi)有對(duì)讀取數(shù)據(jù)發(fā)生的異常作任何處理,而且容易忘記把文件close掉。下面代碼添加異常處理
try:
file = open('tes.txt')
except:
print('fail to open')
try:
data = file.read()
# do something
except:
print('read err')
# do something
finally:
file.close()
這段代碼雖然運(yùn)行良好,但是太冗長(zhǎng)了。下面使用with優(yōu)雅地實(shí)現(xiàn)文件操作
with open('tes.txt') as file:
data = file.read()
# do something
這里with會(huì)自動(dòng)處理文件關(guān)閉操作。這里沒(méi)有對(duì)打開(kāi)文件異常作處理,數(shù)據(jù)讀取異的處理是文件對(duì)象中定義的,因?yàn)槭荂寫的模塊,不知道實(shí)際處理情況。實(shí)際使用時(shí)候用try except外層處理一次應(yīng)該就夠了
自定義with處理對(duì)象
定義一個(gè)對(duì)象并實(shí)現(xiàn)enter()與exit()方法,分別進(jìn)行預(yù)處理與后處理。enter()返回一個(gè)任意對(duì)象給as使用
class Tes:
def __enter__(self):
print('in enter')
# raise ValueError('enter error') # 這里的異常會(huì)直接退出,不會(huì)執(zhí)行with block與__exit__()
return self
def __exit__(self, exc_type, exc_val, exc_tb):
print('in exit')
print(exc_type)
print(exc_val)
print(exc_tb)
if exc_type is ValueError:
return True #返回ture時(shí) with block的ValueError異常會(huì)被攔截, 程序會(huì)正常執(zhí)行
# 這個(gè)不是必需的
def dosomething(self):
print('do something')
with Tes() as t:
t.dosomething()
raise ValueError('block error')
## 運(yùn)行結(jié)果
# in enter
# do something
# in exit
# <class 'ValueError'>
# block error
# <traceback object at 0x102a255c8>
with多個(gè)對(duì)象
with open('1.txt') as f1, open('2.txt') as f2:
# do something with f1, f2