本篇文章给大家分享的是有关python中如何使用Context Managers上下文管理器,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。
创新互联专注于嘉峪关网站建设服务及定制,我们拥有丰富的企业做网站经验。 热诚为您提供嘉峪关营销型网站建设,嘉峪关网站制作、嘉峪关网页设计、嘉峪关网站官网定制、成都微信小程序服务,打造嘉峪关网络公司原创品牌,更为您提供嘉峪关网站排名全网营销落地服务。
新建一个python文件命名为py3_contextmanager.py,在这个文件中进行操作代码编写:
# Context Managers上下文管理器
#用来有效的管理资源,之前在讲文件读写操作中
#有提到过
#现在以文件读写为例
#演示 Context Managers上下文管理器
#普通的文件写入操作:
f = open('test.txt','w')
f.write('写入数据到文件!')
f.close()
#接下来使用 Context Managers的方式完成:
with open('test_new.txt','w') as f:
f.write('写入数据到文件!')
#这里我们并没有去写关闭文件的操作
#因为当我们完成自己的代码操作,退出
#with上下文管理器后,文件会自动关闭
#上下文管理器常用在数据库的连接关闭
#还可以获取释放锁等操作
#接下来我们自定义一个上下文管理器类
#用来打开文件
class Open_File():
#初始化文件名和文件打开的模式
def __init__(self,filename,mode):
self.filename = filename
self.mode = mode
#设置上下文管理器的实际操作
#打开文件
def __enter__(self):
self.file = open(self.filename,self.mode)
return self.file
#退出管理器时,执行关闭文件操作
def __exit__(self,exc_type,exc_val,traceback):
self.file.close()
#使用上下文管理器
#with这行代码块实际执行了
#Open_File类中的 __init__
#__enter__两个方法
with Open_File('sample.txt','w') as f:
f.write('testing')
#我们打印文件的状态
print(f.closed)#True
#接下来使用装饰器来重写上面的
#自定义上下文管理器
#需要导入模块contexlib
from contextlib import contextmanager
@contextmanager
def open_file(file,mode):
try:
f = open(file,mode)
yield f
finally:
f.close()
#调用管理器
with open_file('sample_new.txt','w') as wf:
wf.write('写入数据!')
print(wf.closed)
#接下来看一个os模块中的操作
import os
#获取当前工作目录
cwd = os.getcwd()
#切换到指定目录test1
os.chdir('test1')
#列出该目录中的所有内容
print(os.listdir())
#切换回当前工作目录
os.chdir(cwd)
#获取当前工作目录
cwd = os.getcwd()
#切换到指定目录test2
os.chdir('test2')
#列出该目录中的所有内容
print(os.listdir())
#切换回当前工作目录
os.chdir(cwd)
#我们要做同样的事情很多次
#运行我们得到结果如下:
#['test1.doc', 'test1.txt']
#['test2.doc', 'test2.txt']
#上边的代码逻辑非常适合
#使用上下文管理器实现
#修改如下:
@contextmanager
def change_dir(destination):
try:
cwd = os.getcwd()
os.chdir(destination)
#这里yield返回所有
yield
finally:
os.chdir(cwd)
#调用:
with change_dir('test1'):
print(os.listdir())
with change_dir('test2'):
print(os.listdir())
以上就是python中如何使用Context Managers上下文管理器,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注创新互联行业资讯频道。