Python裏處理文件with open寫法的由來

使用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__()

參考文章:

https://www.cnblogs.com/DswCnblog/p/6126588.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章