Python

34|with 上下文管理器为什么能自动关闭资源

面向按顺序学习 Python 的初学者,本篇在第 30、33 篇知识上,帮助读者使用上下文管理器可靠释放文件资源。

◉ 1.2k 字◌ 8 分钟♙ 郑在混

这套课程按知识依赖排列。本篇的前置知识是:第 30、33 篇。学完后,你应该能够使用上下文管理器可靠释放文件资源。

本篇要解决的问题

本篇只处理“with 上下文管理器为什么能自动关闭资源”这一件事。示例基于 Python 3.14.6,在 macOS 环境核验;除明确标注的终端命令外,代码本身只使用 Python 标准能力。

先看清一个容易误解的细节

with 管理资源生命周期

进入 with 时取得资源,代码块结束时执行退出逻辑。即使块内发生异常,文件也会得到关闭机会。

核心概念

  • with 把资源获取和释放配成一个清晰边界。
  • as file 得到的是上下文返回的资源对象。
  • 文件、锁和数据库连接等资源常提供上下文管理协议。

跟着示例运行

把下面代码保存到本课脚本并运行:

from pathlib import Path

file_path = Path("notes.txt")

with file_path.open("w", encoding="utf-8") as file:
    file.write("上下文管理器\n")

with file_path.open("r", encoding="utf-8") as file:
    print(file.read())

print(file.closed)

预期结果:

上下文管理器

True

输出中包含环境路径、集合元素或日志格式时,具体文字和顺序可能随本机环境变化;判断是否成功应以本篇说明的关键结果为准。

按执行顺序拆开看

  1. 进入 with 时,文件对象的上下文协议返回可用资源并绑定到 file
  2. 离开代码块时自动执行退出逻辑;即使块内抛出异常,也会尝试关闭文件。

初学者容易混淆的地方

  • with 代码块外继续读写已经关闭的文件对象。
  • 误以为 with 会自动处理所有业务异常;它只保证执行资源退出协议。

练习

  1. 把第 30 篇的手动 open/close 改写为 with
  2. with 块后检查 file.closed

练习应先独立完成,再通过增加 print 输出或检查文件内容观察中间状态。当前课程尚未讲到的能力,不要求提前搜索复杂写法。

本篇边界

本篇目标是使用上下文管理器可靠释放文件资源。没有展开的高级机制会放到后续课程;先确保能够解释示例中每一行代码,再进入下一篇。

相关文章

© 2026 郑在混知识库 · 已运行 46 天 · 豫ICP备2026037626号-1