一、with语句的使用
向文件中写入数据的示例代码:
# 1、以写的方式打开文件
f = open("1.txt", "w")
# 2、写入文件内容
f.write("hello world")
# 3、关闭文件
f.close()
代码说明:
- 文件使用完后必须关闭,因为文件对象会占用操作系统的资源,并且操作系统同一时间能打开的文件数量也是有限的
这种写法可能出现一定的安全隐患,错误代码如下:
# 1、以读的方式打开文件
f = open("1.txt", "r")
# 2、读取文件内容
f.write("hello world")
# 3、关闭文件
f.close()
运行结果:
Traceback (most recent call last):
File "/home/python/Desktop/test/xxf.py", line 4, in <module>
f.write("hello world")
io.UnsupportedOperation: not writable
代码说明:
- 由于文件读写时都有可能产生IOError,一旦出错,后面的f.close()就不会调用。
- 为了保证无论是否出错都能正确地关闭文件,我们可以使用try ... finally来解决
安全写法, 代码如下:
try:
# 1、以读的方式打开文件
f = open("1.txt", "r")
# 2、读取文件内容
f.write("xxxxx")
except IOError as e:
print("文件操作出错", e)
finally:
# 3、关闭文件
f.close()
运行结果:
文件操作出错 not writable
这种方法虽然代码运行良好,但是缺点就是代码过于冗长,并且需要添加try-except-finally语句,不是很方便,也容易忘记.
在这种情况下,Python提供了 with 语句的这种写法,既简单又安全,并且 with 语句执行完成以后自动调用关闭文件操作,即使出现异常也会自动调用关闭文件操作。
with 语句的示例代码:
# 1、以写的方式打开文件
with open("1.txt", "w") as f:
# 2、读取文件内容
f.write("hello world")
二、上下文管理器
1.上下文管理器的介绍
一个类只要实现了__enter__()和__exit__()这两个方法,通过该类创建的对象我们就称之为上下文管理器。
2.扩展说明
上下文管理器可以使用 with 语句,with语句之所以这么强大,背后是由上下文管理器做支撑的,也就是说刚才使用 open 函数创建的文件对象就是就是一个上下文管理器对象。
3.上下文管理器类,模拟文件操作:
class File(object):
def __init__(self,file_name,file_model):
self.file_name = file_name
self.file_model = file_model
# 定义上文方法
def __enter__(self):
print("进入上文方法")
# 打开文件
self.file = open(file_name, file_model):
# 返回文件资源
return self.file
# 定义下文方法
def __exit__(self,ex_type, exc_val, ext_tb):
print("进入下文方法")
self.file.close()
if __name__ == '__main__':
with File("csdn.txt", "r") as file:
data = file.read()
print(data)
运行结果:
进入上文方法
hello world
进入下文方法
说明:
- __enter__方法表示上文方法,需要返回一个操作文件对象
- __exit__方法表示下文方法,with语句执行完成后自动执行,即使出现了异常也会执行该方法。