Logo

郎哥编程

with语句与上下文管理

2020-12-29 151

在实际编程过程中,对文件的操作涉及到很多处理语句,例如:需要使用异常处理语句来处理操作文件可能出现的异常,不管异常有没有出现,都要关闭打开的文件以释放文件对象占用的资源。

处理文件的参考代码:

#待打开文件路径
filename = "d://test.txt"
try:
    #使用r模式打开文本文件,编码方式为utf-8
    open_sucess = True
    fp = open(filename,"r",encoding='utf-8')
    #处理文件的语句
    pass
except FileNotFoundError:
    print("文件打开失败,%s文件不存在" % filename)
    open_sucess = False
except IOError:
    # 处理文件过程中可能出现的异常
    pass
finally:
    #若文件打开成功,关闭文件对象
    if open_sucess:
        print("关闭文件")
        fp.close()

文件打开成功,必须要关闭文件对象,关闭文件对象的语句放置在finally子句内,关闭文件对象之前需要判断文件是否已成功打开。

with语句

Python提供的with语句可以简化文件操作代码,不需要使用异常处理语句来处理操作文件可能出现的异常,with语句会把文件处理操作涉及的文件对象、变量、函数封装到一个上下文管理器对象,使用下文管理器可以保存和恢复各种全局状态,锁定和解锁资源,关闭打开的文件等等。

Python提供了上下文管理协议,上下文管理协议要求实现的类定义__enter__()和__exit__()两个方法。

上下文管理器是支持上下文管理协议的对象,该对象实现了__enter__()和__exit__()方法。

上下文管理器定义执行with语句时要建立运行时上下文,负责执行with语句块上下文中的进入与退出操作。通常使用with语句调用上下文管理器,也可以通过直接调用其方法来使用。

with语句的语法结构如下:

with expression [as target]:
   codebody

其中with是Python关键字,expression是一个表达式,可以是一个函数,也可以是一个对象,但是如果是函数,函数必须返回一个实现了上下文管理协议的对象,如果是一个对象,这个对象必须是上下文管理器对象。

target是可选的,如果 with 语句中包含一个target,来自 __enter__() 的返回值将被赋值给它

codebody是要执行的代码块。

使用with语句,在操作文件时,就不需要担心文件对象的关闭问题了,with语句启动的上下文管理器会自动关闭打开的文件对象。

#待打开文件路径
filename = "d://test.txt"
#使用with语句操作文件
with open (filename,"r",encoding='utf-8') as fp:
  print(fp.read())
  #其它处理语句
  pass

open函数会返回一个文件对象,文件对象是支持上下文管理协议的对象,fp是执行上下文管理器__enter__()方法返回的文件对象,with语句内的代码块执行完成后,上下文管理器会自动关闭打开的文件对象。

with语句可以简化 try...except...finally 使用模式的语句,多用于需要释放被访问资源的代码块,例如释放文件对象资源、线程中锁的自动获取和释放等。

代码在线纠错(通义千问 qwen-max)

支持粘贴多个代码文件,提交后由阿里云通义千问自动分析代码漏洞、语法错误、逻辑问题并给出修改建议。
您已解锁 AI 代码纠错功能,可正常使用!

评论区

登录 后发表评论
暂无评论