Cover image

Python with 语句

Oct 19, 2015

Python I/O

我们知道,在程序中打开文件的时候,往往需要考虑一些乱七八糟的异常出现的情况,例如文件不存在啦,没有可读可写的权限啦,亦或是硬盘已满。所以我们经常会用到try/except语句来捕获异常, 而为了防止文件被破坏,我们还需要finally语句来保证文件的关闭,如下例子:

try:
    f = open(filepath,'rb')
    fw = open(filepath2,'wb')
    for i in f.readline():
        print(i,file=fw)
except IOError:
    print "Error happened!"
finally:
    f.close();
    fw.close();

这么冗长臃肿的代码,显然不是我们这些强迫症患者所喜爱的,必需要找个方式把他解决掉,那就是withwith是python2.5引入的,到了2.6就已经成为默认关键字。加了with的代码是以下形式:

with open(filepath,'rb') as f, open(filepath2,'wb') as fw:
    for i in f.readline():
        print(i,file=fw)

然后我们还可以通过nested这样用:

form contextlib import nested
with nested(open(filepath,'rb'),open(filepath2,'wb') as (f,fw)):
    for i in f.readline():
        print(i,file=fw)

从此以后,妈妈再也不用担心我的文件打开后忘记关闭了。

with语句引入了一个“上下文管理协议”(Context Management Protocol),对资源访问后发生异常能够正常关闭资源。具体实现是通过定义两个方法__enter__()以及__exit__()方法来操作。 这里有一篇参考文献《浅谈Python的with语句》


19 Oct 2015

Post by: MetaCoder