这套课程按知识依赖排列。本篇的前置知识是:第 30、33 篇。学完后,你应该能够使用上下文管理器可靠释放文件资源。
本篇要解决的问题
本篇只处理“with 上下文管理器为什么能自动关闭资源”这一件事。示例基于 Python 3.14.6,在 macOS 环境核验;除明确标注的终端命令外,代码本身只使用 Python 标准能力。
先看清一个容易误解的细节
进入 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
输出中包含环境路径、集合元素或日志格式时,具体文字和顺序可能随本机环境变化;判断是否成功应以本篇说明的关键结果为准。
按执行顺序拆开看
- 进入
with时,文件对象的上下文协议返回可用资源并绑定到file。 - 离开代码块时自动执行退出逻辑;即使块内抛出异常,也会尝试关闭文件。
初学者容易混淆的地方
- 在
with代码块外继续读写已经关闭的文件对象。 - 误以为
with会自动处理所有业务异常;它只保证执行资源退出协议。
练习
- 把第 30 篇的手动
open/close改写为with。 - 在
with块后检查file.closed。
练习应先独立完成,再通过增加 print 输出或检查文件内容观察中间状态。当前课程尚未讲到的能力,不要求提前搜索复杂写法。
本篇边界
本篇目标是使用上下文管理器可靠释放文件资源。没有展开的高级机制会放到后续课程;先确保能够解释示例中每一行代码,再进入下一篇。
相关文章
01|Python 程序从源码到输出经历了什么
面向按顺序学习 Python 的初学者,本篇在零基础上,帮助读者理解源代码、解释器和输出之间的关系。
02|在 macOS 安装并确认 Python 3 环境
面向按顺序学习 Python 的初学者,本篇在第 01 篇知识上,帮助读者在 macOS 中确认 Python 3.14 和 pip 是否可用。
03|交互式解释器和 Python 脚本怎么选择
面向按顺序学习 Python 的初学者,本篇在第 02 篇知识上,帮助读者根据任务选择 REPL 或 `.py` 脚本。
04|建立第一个 Python 项目目录
面向按顺序学习 Python 的初学者,本篇在第 03 篇知识上,帮助读者理解当前目录并正确运行项目脚本。

