with上下文管理机制

上下文管理

1.什么是with语句?

  1. with是一种上下文管理协议,目的在于从流程图中把 try,except 和finally 关键字和资源分配释放相关代码统统去掉,简化try….except….finlally的处理流程。
  2. 所以使用with处理的对象必须有enter()和exit()这两个方法
      1)with通过enter方法初始化(enter方法在语句体执行之前进入运行)
      2)然后在exit中做善后以及处理异常(exit()方法在语句体执行完毕退出后运行)

with是一个上下文管理器,用于执行代码块所需要的运行的时候的上下文入口和出口。上下文管理器的典型用法包括保存和还原各种全局状态,锁定和解锁资源,关闭打开的文件等。

先执行__enter__方法,再执行__exit__方法,当对象被实例化时,就会主动调用__enter__()方法,任务执行完成后就会调用__exit__()方法。

2. with语句使用场景

  1. with 语句适用于对资源进行访问的场合,确保不管使用过程中是否发生异常都会执行必要的“清理”操作,释放资源
  2. 比如文件使用后自动关闭、线程中锁的自动获取和释放等。

文件基本操作
打开文件:f = open(fole_name,mode = ‘r’),传入表示文件路径的字符串,会返回一个文件对象,mode是文件打开模式。

关闭文件:f.close(),调用给定文件对象的close方法。

3.文件打开模式:

  • r:以只读方法打开文件,文件指针默认放在文件开头,文件不存在就报错。
  • r+:打开一个文件用于读写,文件指针默认放在文件开头,文件不存在则报错
  • w:打开一个文件只用于写入,如果文件已存在则将其覆盖,不存在就创建一个新文件。
  • w+:打开一个文件用于读写,如果文件已存在则将其覆盖,不存在就创建一个新文件。
  • a:打开一个文件用于追加,如果文件存在,文件指针会放在文件结尾,不存在就会创建一个新文件进行写入。
  • a+:打开一个文件用于读写,如果文件存在,文件指针会放在文件结尾,不存在就会创建一个新文件进行写入。
  • 其他模式还有:rb 、rb+ 、wb 、 wb+ 、ab 、ab+。加个b的意思是以二进制的格式写入。

读取/写入文件:

f.read():读取指定大小的内容。
f.readline():读取一行内容。
f.readlines():读取多行内容。
f.write(data):写入内容。
f.writelines(lines):写入多行内容,但需要自己加换行符。
f.flush():立即刷新缓冲。
f.tell():返回文件指针的位置。
f.seek(position):调整文件指针的位置。
上下文管理
上下文管理就是我们常用的with…as…方法。他可以在我们打开文件后自动地关闭文件。在这上下文管理协议中,就涉及到了两个魔法方法,一个是__enter__,另一个是__exit__。

enter(self):当with开始运行的时候触发此方法的运行,返回值返回给as后面的变量。
exit(self, exc_type, exc_val, exc_tb):当with运行结束之后触发此方法的运行,其中如果抛出异常,exc_type、exc_val、exc_tb分别表示异常的类型、异常内容、异常显示所在位置。
下面的例子就是重写open里的两个方法测试一下文件打开、写入、读取、关闭所消耗的时间:

from datetime import datetime
class test_time():
    def __init__(self,filename,mode):
        self.filename = filename
        self.mode = mode
    def __enter__(self):
        self.start_time = datetime.now()
        self.f = open(self.filename,self.mode)
        return self.f
    def __exit__(self, exc_type, exc_val, exc_tb):
        self.end_time = datetime.now()
        time = self.end_time - self.start_time
        print("程序运行时间为%s"%time)

run = test_time('tem.txt','w+')
with run as f:
    f.write("hello,world!my name is long")
    f.readline()

这段代码的作用:打开一个文件,如果一切正常,把文件对象赋值给f,然后用迭代器遍历文件中每一行,当完成时,关闭文件;
而无论在这段代码的任何地方,如果发生异常,此时文件仍会被关闭。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hsw Come on

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值