Python 文件关闭流浅析|Python 主题月

本文正在参加「Python主题月」,详情查看 活动链接

回顾复习

上期在Python文件管理浅析一文对文件管理进行基本的学习,对文件类型有两种文本文件二进制文件

文件相关的模块有iooscv等模块大致了解。

我们也知道要对文件操作有三个步骤

  1. 创建文件对象,打开文件
  2. 对文件进行读写等操作
  3. 文件操作完后,关闭文件

由于文件底层是由操作系统操作的,Python解释器对文件对象操作后必须要对关闭操作。

因此,Python文件关闭流提供两个方法:

  • close()方法,一般与异常机制finally来确保文件能正常关闭
  • with文件管理器

close()方法与finally机制结合也能处理异常,但是代码会非常冗余

建议使用with语句除了更优雅的语法,还能很好的处理上下文环境产生的异常

1. close()方法

close()方法属于IO类(模块)方法之一。

close()方法用于关闭一个已打开的文件。

文件关闭相关情况说明如下:

  1. 关闭后的文件不能再进行读写操作,否则会触发ValueError错误
  2. close()方法允许调用多次
  3. 当文件对象,被引用到操作另外一个文件时,Python会自动关闭之前的文件对象
  4. 要习惯对文件操作后要关闭文件,时刻避免任何异常出现

close() 方法语法如下:

文件对象.close();
复制代码

我们来看一下close方法Python解释器

close代码

可以看到, close()返回值是None

我们来看一个?:

f = open("JueJing.txt","a")
s = "JueJing Python"
f.write(s)
f.close()

复制代码

close方法

我们从上面的例子可以看到流程步骤为四步:

  1. 创建文件对象,打开文件JueJing.txt
  2. 写入字符串“JueJing”到文件里
  3. 如果程序没有出现问题,顺利地执行关闭文件操作
  4. 假如程序出现异常,我们的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 代码块
复制代码

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解释器显示的结果:
with运行结果

Juejing.txt文件打印

JueJing.txt文件内容

总结

今天,详细学习啦文件关闭流的两种方式close()方法和with方法。让我们更好在平时工作选择使用,正所谓“知其然”也要“知其所以然”

以上是本期内容,欢迎大佬们指导,下次见~

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享