with语句 (一种上下文管理器)
所谓上下文管理器是指:任何实现了__enter__()和__exit__()方法的对象,with语句可以自动管理上下文资源,不论什么原因跳出with块,都能保证文件正确关闭,以此来达到释放资源的目的。
在Python中,若需要打开文件并访问文件,您可以使用open()函数来实现。Open返回一个文件对象,该文件对象具有用于获取有关已打开文件的信息和对其进行操作的方法和属性。 对打开的文件进行操作后,就需要关闭该文件,否则会出现什么情况呢?极端情况下可能会出现”Too many open files”的错误,因为系统允许你打开的文件数量是有限的。
下面来看看如何正确关闭一个文件:....
普通版:
关闭文件语法格式:文件对象.close()
>>> f1=open("test1.txt","w") #写方式打开一个不存在的文件,等价于创建文件
>>> f1.write("Hello,Python")
12
>>> f1.close()
其中存在一个潜在的问题,如果在调用write的过程中出现异常后续代码无法进行,close 方法就无法被正常调用,文件就无法被正常关闭。
进化版:
f1=open("test1.txt","w")
try:
f1.write("Hello,Python")
except SyntaxError:
print("SyntaxError")
finally:
f1.close()
try代码块程序异常时,后续代码块不再执行,而直接跳转到except代码块,但无论如 何,finally块的代码最终都会被执行,close在finally代码中 ,文件一定会关闭
高级版:
自动关闭的with语句语法格式:
with open(filename,mode) as f:
#文件处理操作
#ContentMgr实现了特殊方法__enter__()和__exit__(),所以称该类对象遵守上下文管理器协议,该类对象的实例对象,称为上下文管理器(ContentMgr())
class ContentMgr (object):
def __enter__ (self):
print("enter方法被调用执行了")
return self
def __exit__ (self,exc_type,exc_val,exc_tb):
print("exit方法被调用执行了")
def show (self):
print("show方法被调用执行了")
with ContentMgr() as file: #相当于file=ContentMgr()
file.show()
#执行结果如下
enter方法被调用执行了
show方法被调用执行了
exit方法被调用执行了
离开运行时上文,自动调用上下文管理器管理器特殊方法__exit__()