news 2026/5/1 10:42:47

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/1 4:03:56

【大数据毕设全套源码+文档】基于python国潮男装微博评论数据分析系统的设计与实现(丰富项目+远程调试+讲解+定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

作者头像 李华
网站建设 2026/4/30 10:12:03

【大数据毕设全套源码+文档】基于python+数据可视化内蒙古旅游景点数据分析系统的设计与实现(丰富项目+远程调试+讲解+定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

作者头像 李华
网站建设 2026/5/1 4:05:10

【大数据毕设源码分享】基于python+Hadoop的智慧校园数据共享平台的设计与实现(程序+文档+代码讲解+一条龙定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

作者头像 李华
网站建设 2026/5/1 4:06:44

【大数据毕设源码分享】基于python内蒙古旅游景点数据分析系统的设计与实现(程序+文档+代码讲解+一条龙定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

作者头像 李华
网站建设 2026/5/1 4:08:51

conda activate yolov13一行命令激活开发环境

conda activate yolov13一行命令激活开发环境 你是否还在为配置 YOLO 环境而耗费半天时间?git clone 卡住、依赖报错、CUDA 版本不匹配、PyTorch 安装失败……这些问题在深度学习入门阶段几乎人人都遇到过。而现在,这一切都可以被一句话解决&#xff1a…

作者头像 李华
网站建设 2026/5/1 4:09:05

麦橘超然能否商用?个人创作与商业使用的边界说明

麦橘超然能否商用?个人创作与商业使用的边界说明 1. 引言:当AI艺术走进现实,版权问题如何界定? 你有没有想过,用AI生成的一张惊艳海报,能不能直接拿去开店使用?一个靠AI设计的角色形象&#x…

作者头像 李华