在实际编程过程中,对文件的操作涉及到很多处理语句,例如:需要使用异常处理语句来处理操作文件可能出现的异常,不管异常有没有出现,都要关闭打开的文件以释放文件对象占用的资源。
处理文件的参考代码:
#待打开文件路径
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 使用模式的语句,多用于需要释放被访问资源的代码块,例如释放文件对象资源、线程中锁的自动获取和释放等。