本文正在参加「Python主题月」,详情查看 活动链接
回顾复习
上期在Python文件管理浅析一文对文件管理进行基本的学习,对文件类型有两种文本文件和二进制文件。
文件相关的模块有io、os、cv等模块大致了解。
我们也知道要对文件操作有三个步骤
- 创建文件对象,打开文件
- 对文件进行读写等操作
- 文件操作完后,关闭文件
由于文件底层是由操作系统操作的,Python解释器对文件对象操作后必须要对关闭操作。
因此,Python文件关闭流提供两个方法:
- close()方法,一般与异常机制finally来确保文件能正常关闭
- with文件管理器
close()方法与finally机制结合也能处理异常,但是代码会非常冗余
建议使用with语句除了更优雅的语法,还能很好的处理上下文环境产生的异常
1. close()方法
close()方法属于IO类(模块)方法之一。
close()方法用于关闭一个已打开的文件。
文件关闭相关情况说明如下:
- 关闭后的文件不能再进行读写操作,否则会触发ValueError错误
- close()方法允许调用多次
- 当文件对象,被引用到操作另外一个文件时,Python会自动关闭之前的文件对象
- 要习惯对文件操作后要关闭文件,时刻避免任何异常出现
close() 方法语法如下:
文件对象.close();
复制代码
我们来看一下close方法Python解释器
可以看到, close()返回值是None
我们来看一个?:
f = open("JueJing.txt","a")
s = "JueJing Python"
f.write(s)
f.close()
复制代码
我们从上面的例子可以看到流程步骤为四步:
- 创建文件对象,打开文件JueJing.txt
- 写入字符串“JueJing”到文件里
- 如果程序没有出现问题,顺利地执行关闭文件操作
- 假如程序出现异常,我们的OS无法对文件进行关闭,这时候一直占用系统资源
为了,解决第4步的出现异常情况,也能正常执行关闭文件操作,我们可以使用前面学到的异常机制finally来进行处理
优化上述代码如下
try:
f = open("JueJing.txt","a")
s = "JueJing Python"
f.write(s)
except BaseException as e:
print(e)
finally:
f.close()
复制代码
2. with文件管理
with语句的语法context_expression 用于创建可自动关闭的资源。
with context expression [as target(s)]:
with 代码块
复制代码
文件管理器协议(Context Management Protocol)支持该协议的对象要实现这
主要有两个方法
__enter__()
__exit__()
上下文管理器(Context Manager): 支持上下文管理协议的对象,这种
对象实现了__enter__()
和 __exit__()
方法。
- 上下文管理器定义执行 with 语句时要建立的运行时上下文
- 负责执行 with 语句块上下文中的进入与退出操作。
- 通常使用 with 语句调用上下文管理器,也可以通过直接调用其方法来使用。
运行时上下文(runtime context): 由上下文管理器创建,通过上下文管理器的 __enter__()
和__exit__()
方法实现。
__enter__()
方法在语句体执行之前进入运行时上下文__exit__()
在语句体执行完后从运行时上下文退出
上下文表达式(Context Expression): with 语句中跟在关键字 with 之后的表达式,该表达式要返回一个上下文管理器对象。
语句体(with-body): with 语句包裹起来的代码块,在执行语句体之前会调用上下文管理器的 __enter__()
方法,执行完语句体之后会执行__exit__() 方法。
我们把第一节使用finally的方式改写成with语句,如下
with open("JueJing.txt","a") as f:
s = "JueJing Python"
f.write(s)
复制代码
对比使用finally代码的来说,with语句更加简洁和优雅
Python解释器显示的结果:
Juejing.txt文件打印
总结
今天,详细学习啦文件关闭流的两种方式close()方法和with方法。让我们更好在平时工作选择使用,正所谓“知其然”也要“知其所以然”
以上是本期内容,欢迎大佬们指导,下次见~