使用python讀寫文件,一開始我們用的是:
f = open('test.txt', 'r')
f.read()
最後一步是調用close()方法關閉文件
f.close()
如果打開報錯IOError,那後面的close也不會執行,因此,我們可以使用try語句來容錯:
try:
f = open('/path/to/file', 'r')
print(f.read())
finally:
if f:
f.close()
但每次這樣寫就太冗長了,於是有了一種優雅的寫法:
with open('/path/to/file', 'r') as f:
print(f.read())
==========================with是如何工作的==============================
#!/usr/bin/env python
# with_example01.py
class Sample:
def __enter__(self):
print "In __enter__()"
return "Foo"
def __exit__(self, type, value, trace):
print "In __exit__()"
def get_sample():
return Sample()
with get_sample() as sample:
print "sample:", sample
with 後面跟的語句get_sample()返回的是一個Sample對象
with要求Sample對象必須有一個__enter__()方法,一個__exit__()方法
當get_sample()返回一個Sample對象時,會調用Sample的__enter__()方法,__enter__()方法的返回值將賦給as後面的變量
在with後面的代碼塊拋出任何異常或者成功執行完成時,__exit__()方法被執行,將調用前面返回對象的__exit__()方法。
異常拋出時,與之關聯的type,value和stack trace傳給__exit__()方法,因此拋出的異常會被打印出來
所以上面這段代碼的輸出應該是
In __enter__() sample: Foo In __exit__()
參考文章: