news 2026/5/30 7:47:08

Python 中with语句详解和代码示例

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Python 中with语句详解和代码示例

Python 中的with语句是**上下文管理器(Context Manager)**最常见、最优雅的使用方式。它主要解决资源管理的问题(文件、网络连接、数据库连接、锁、临时目录等),能保证“无论是否发生异常,资源都会被正确释放”。

with 语句的核心价值(一句话总结)

替代传统的try-finally结构,让代码更简洁、更安全、更可读。

1. 最常见的用法 —— 文件操作

# 传统写法(容易忘记 close)f=open('data.txt','r',encoding='utf-8')try:content=f.read()print(content)finally:f.close()# 必须写在 finally 里# 使用 with(推荐)withopen('data.txt','r',encoding='utf-8')asf:content=f.read()print(content)# 这里可以随意写多行操作# with 语句块结束后,f 自动被关闭(即使中间抛异常也一样)print(f.closed)# True

2. with 同时打开多个资源(Python 3.1+)

withopen('input.txt')asfin,open('output.txt','w')asfout:forlineinfin:fout.write(line.upper())

Python 3.3+ 更推荐这种写法(括号可省略):

with(open('input.txt',encoding='utf-8')asfin,open('output.log','a',encoding='utf-8')aslog):log.write("开始处理\n")forlineinfin:log.write(f"处理:{line.strip()}\n")

3. 常见的内置上下文管理器

场景写法示例主要作用
文件with open(...) as f:自动关闭文件
线程锁with lock:自动获取/释放锁
decimal 精度控制with decimal.localcontext(prec=10):临时改变精度,退出后恢复
临时改变目录with tempfile.TemporaryDirectory() as tmp:用完自动删除临时目录
关闭连接with conn:(数据库连接对象)自动 commit / rollback + 关闭
抑制特定异常with contextlib.suppress(FileNotFoundError):忽略指定异常,不打印 traceback

4. 自己编写上下文管理器(两种主流方式)

方式一:基于类(最清晰、最常用)
classMyTimer:def__init__(self,name=""):self.name=namedef__enter__(self):importtime self.start=time.perf_counter()print(f"[{self.name}] 开始计时...")returnself# 可以返回 self 供 as 变量使用def__exit__(self,exc_type,exc_value,traceback):importtime elapsed=time.perf_counter()-self.startprint(f"[{self.name}] 结束,用时:{elapsed:.4f}秒")# 返回 True 表示“吞掉”异常;返回 False 或 None 则异常继续向外抛returnFalse# 使用withMyTimer("下载任务")ast:time.sleep(1.2)# 模拟一些工作
方式二:用 @contextmanager 装饰器(更简洁)
fromcontextlibimportcontextmanagerimporttime@contextmanagerdeftimer(name=""):start=time.perf_counter()print(f"[{name}] 开始...")try:yield# yield 之前的代码是 __enter__,之后的代码是 __exit__finally:elapsed=time.perf_counter()-startprint(f"[{name}] 结束,用时:{elapsed:.3f}s")# 使用方式和普通 with 完全一样withtimer("测试块"):time.sleep(0.8)print("正在干活...")

5. 常见面试/进阶问题点

问题答案要点
with 语句执行顺序是什么?1. 执行__enter__()
2. 执行 with 代码块
3. 执行__exit__()(无论是否异常)
__exit__返回 True 有什么效果?代表“异常已被处理”,外层不会再看到这个异常
可以用 with 写多层嵌套吗?可以,但建议用并列写法(Python 3.3+ 支持括号多上下文)
为什么数据库连接库都支持 with?因为实现了上下文管理协议,能自动管理事务和连接关闭
contextlib.ExitStack有什么用?当你需要在运行时动态决定要管理的资源数量时使用(高级用法)

6. 总结口诀

希望这些例子和说明能帮你彻底搞懂with语句~
有哪部分还想再深入看看吗?(比如 ExitStack、多线程锁、asyncio 中的 async with 等)

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/29 14:18:22

Qwen3-Embedding-0.6B横向评测:在Hugging Face Embeddings中表现如何

Qwen3-Embedding-0.6B横向评测:在Hugging Face Embeddings中表现如何 1. Qwen3-Embedding-0.6B 介绍 Qwen3 Embedding 模型系列是 Qwen 家族的最新专有模型,专门设计用于文本嵌入和排序任务。基于 Qwen3 系列的密集基础模型,它提供了各种大…

作者头像 李华
网站建设 2026/5/20 10:14:48

揭秘Java Stream sorted多字段排序:3个你必须掌握的实战技巧

第一章:揭秘Java Stream sorted多字段排序的核心机制在Java 8引入的Stream API中,sorted()方法为集合数据的排序提供了函数式编程的优雅解决方案。当需要基于多个字段进行复合排序时,开发者可通过Comparator的链式组合实现精准控制。其核心机…

作者头像 李华
网站建设 2026/5/22 6:07:18

YOLOv10官版镜像环境配置全解析,再也不混乱

YOLOv10官版镜像环境配置全解析,再也不混乱 你是否也经历过这样的场景:刚听说YOLOv10发布了,性能暴涨还不用NMS,赶紧想试一试,结果环境装了大半天,依赖报错一堆,CUDA版本不匹配,Pyt…

作者头像 李华
网站建设 2026/5/25 16:50:37

开源大模型趋势一文详解:NewBie-image-Exp0.1引领动漫生成新范式

开源大模型趋势一文详解:NewBie-image-Exp0.1引领动漫生成新范式 1. NewBie-image-Exp0.1:开启高质量动漫生成的新篇章 在当前AI图像生成技术飞速发展的背景下,专注于特定风格的垂直领域大模型正逐渐成为主流。NewBie-image-Exp0.1 就是其中…

作者头像 李华
网站建设 2026/5/24 14:18:24

手机自动化新玩法:Open-AutoGLM自然语言指令实操

手机自动化新玩法:Open-AutoGLM自然语言指令实操 你有没有想过,只要说一句“打开小红书搜美食”,手机就能自动完成打开App、输入关键词、点击搜索这一整套操作?听起来像科幻片的场景,现在通过 Open-AutoGLM 已经可以轻…

作者头像 李华