news 2026/6/9 21:34:01

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/6/10 13:44:17

Llama3-8B日志分析实战:运维助手搭建详细步骤

Llama3-8B日志分析实战:运维助手搭建详细步骤 1. 引言:为什么需要一个AI驱动的运维助手? 在现代IT运维场景中,系统日志每天产生海量数据。从Nginx访问日志到Kubernetes容器日志,再到数据库慢查询记录,这些…

作者头像 李华
网站建设 2026/6/10 10:38:21

Llama3-8B模型更新策略:版本升级部署实战注意事项

Llama3-8B模型更新策略:版本升级部署实战注意事项 1. Meta-Llama-3-8B-Instruct 模型核心特性解析 Meta-Llama-3-8B-Instruct 是 Meta 在 2024 年 4 月推出的开源指令微调模型,作为 Llama 3 系列中的中等规模成员,它在性能、资源占用和实用…

作者头像 李华
网站建设 2026/6/9 18:42:25

Z-Image-Turbo_UI界面怎么用?一文讲清操作全流程

Z-Image-Turbo_UI界面怎么用?一文讲清操作全流程 在AI图像生成工具日益普及的今天,很多用户面临一个共同问题:模型部署复杂、操作门槛高、中文支持弱。即便成功跑通流程,也常常因为界面不友好或步骤繁琐而放弃。 有没有一种方式&…

作者头像 李华