文件操作-with和上下文管理器

Posted yifengs

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了文件操作-with和上下文管理器相关的知识,希望对你有一定的参考价值。

代码:

 1 # -*- coding:utf-8 -*-
 2 # 普通版 如果写入的过程中出错 则不会释放资源
 3 def m1():
 4     f = open("test.txt","w")
 5     f.write("hello python")
 6     f.close()
 7 # 进阶版
 8 def m2():
 9     f = open("test2.txt","w")
10     try:
11         f.write("hello python2")
12     except IOError:
13         print("oops error")
14     finally:
15         f.close()
16 # 高级
17 def m3():
18     with open("test3.txt","w") as f:
19         f.write("hello python3")
20 m1()
21 m2()
22 m3()
23 
24 # 上下文管理器
25 # 任何实现了 __enter__() 和 __exit__() 方法的对象都可称之为上下文管理器,上下文管理器对象可以使用 with 关键字。显然,文件(file)对象也实现了上下文管理器。
26 class File(object):
27     def __init__(self,filename,model):
28         self.filename = filename
29         self.model = model
30 
31     def __enter__(self):
32         print("--enter--")
33         self.f = open(self.filename,self.model)
34         return self.f
35 
36     def __exit__(self, *args):
37         print("--exit--")
38         self.f.close()
39 
40 with File("test4.txt","w") as f:
41     f.write("hello python4")   # 输出  --enter--
42                                     # --exit - -
43 # 装饰器实现上下文管理器
44 from contextlib import contextmanager
45 
46 @contextmanager
47 def my_open(path,model,encod):
48     f = open(path,model,encoding=encod)
49     yield f
50     f.close()
51 
52 with my_open("test5.txt","w",utf-8) as f:
53     f.write("contextmanager实现上下文管理器")

 

以上是关于文件操作-with和上下文管理器的主要内容,如果未能解决你的问题,请参考以下文章

with和上下文管理器

Python高级语法-私有属性-with上下文管理器(4.7.3)

Python核心技术与实战——二一|巧用上下文管理器和with语句精简代码

with与上下文管理器

Python 中 with 上下文管理器

with管理文件操作上下文