python中with用法讲解


Posted in Python onFebruary 07, 2020

我们都知道打开文件有两种方法:

  • f = open()
  • with open() as f:

这两种方法的区别就是第一种方法需要我们自己关闭文件;f.close(),而第二种方法不需要我们自己关闭文件,无论是否出现异常,with都会自动帮助我们关闭文件,这是为什么呢?

我们先自定义一个类,用with来打开它:

class Foo():
  def __enter__(self):
    print("enter called")
  def __exit__(self, exc_type, exc_val, exc_tb):
    print("exit called")
    print("exc_type :%s"%exc_type)
    print("exc_val :%s"%exc_val)
    print("exc_tb :%s"%exc_tb)


with Foo() as foo:
  print("hello python")
  a = 1/0
  print("hello end")

执行结果:

enter called
Traceback (most recent call last):
hello python
exit called
exc_type :<class 'ZeroDivisionError'>
exc_val :division by zero
 File "F:/workspaces/python_workspaces/flask_study/with.py", line 25, in <module>
  a = 1/0
exc_tb :<traceback object at 0x0000023C4EDBB9C8>
ZeroDivisionError: division by zero

Process finished with exit code 1

我们看到,执行结果的输入顺序,分析如下:

当我们with Foo() as foo:时,此时会执行__enter__方法,然后进入执行体,也就是:

print("hello python")
a = 1/0
print("hello end")

语句,但是在a=1/0出现了异常,with将会中止,此时就执行__exit__方法,就算不出现异常,当执行体被执行完毕之后,__exit__方法仍然被执行一次。

我们回到with open("file")as f: 不用关闭文件的原因就是在__exit__方法中,存在关闭文件的操作,所以不用我们手工关闭文件,with已将为我们做好了这个操作,这就可以理解了。

以上就是小编整理的相关内容,如果大家有任何补充可以联系三水点靠木小编。

Python 相关文章推荐
python实现udp数据报传输的方法
Sep 26 Python
Django的数据模型访问多对多键值的方法
Jul 21 Python
Centos Python2 升级到Python3的简单实现
Jun 21 Python
python3编码问题汇总
Sep 06 Python
深入浅出学习python装饰器
Sep 29 Python
Python温度转换实例分析
Jan 17 Python
基于循环神经网络(RNN)的古诗生成器
Mar 26 Python
在IPython中执行Python程序文件的示例
Nov 01 Python
python paramiko利用sftp上传目录到远程的实例
Jan 03 Python
用scikit-learn和pandas学习线性回归的方法
Jun 21 Python
关于Python3爬虫利器Appium的安装步骤
Jul 29 Python
python脚本第一行如何写
Aug 30 Python
如何基于Python实现数字类型转换
Feb 07 #Python
Python while循环使用else语句代码实例
Feb 07 #Python
Python matplotlib画曲线例题解析
Feb 07 #Python
python next()和iter()函数原理解析
Feb 07 #Python
使用tensorflow实现矩阵分解方式
Feb 07 #Python
python匿名函数lambda原理及实例解析
Feb 07 #Python
Python用input输入列表的实例代码
Feb 07 #Python
You might like
PHP容易忘记的知识点分享
2013/04/30 PHP
使用php实现截取指定长度
2013/08/06 PHP
PHP使用正则表达式清除超链接文本
2013/11/12 PHP
PHP文件上传处理案例分析
2016/10/15 PHP
PHP长连接实现与使用方法详解
2018/02/11 PHP
摘自百度的图片轮换效果代码
2007/11/19 Javascript
jQuery EasyUI NumberBox(数字框)的用法
2010/07/08 Javascript
Jquery 获取checkbox的checked问题
2011/11/16 Javascript
JQuery获取浏览器窗口内容部分高度的代码
2012/02/24 Javascript
javascript中文本框中输入法切换的问题
2013/12/10 Javascript
javascript验证邮件地址和MX记录的方法
2015/06/16 Javascript
JS回调函数简单用法示例
2017/02/09 Javascript
Bootstrap组件之下拉菜单,多级菜单及按钮布局方法实例
2017/05/25 Javascript
Angularjs自定义指令Directive详解
2017/05/27 Javascript
js+html5实现半透明遮罩层弹框效果
2020/08/24 Javascript
AngularJS 控制器 controller的详解
2017/10/17 Javascript
elementUI Vue 单个按钮显示和隐藏的变换功能(两种方法)
2018/09/04 Javascript
微信小程序后端实现授权登录
2020/02/24 Javascript
Vue-router 报错NavigationDuplicated的解决方法
2020/03/31 Javascript
[04:44]DOTA2 2017全国高校联赛视频回顾
2017/08/21 DOTA
Python实现windows下模拟按键和鼠标点击的方法
2015/03/13 Python
举例讲解Python中字典的合并值相加与异或对比
2016/06/04 Python
pandas数据处理基础之筛选指定行或者指定列的数据
2018/05/03 Python
Python操作MySQL数据库的方法
2018/06/20 Python
在Pycharm中执行scrapy命令的方法
2019/01/16 Python
Python 基于FIR实现Hilbert滤波器求信号包络详解
2020/02/26 Python
python爬虫开发之使用Python爬虫库requests多线程抓取猫眼电影TOP100实例
2020/03/10 Python
Keras - GPU ID 和显存占用设定步骤
2020/06/22 Python
英国手机零售商:Carphone Warehouse
2018/06/06 全球购物
自荐信怎么写好
2013/11/11 职场文书
新任教师自我鉴定
2014/02/24 职场文书
《雕塑之美》教学反思
2014/04/24 职场文书
婚纱店策划方案
2014/05/22 职场文书
设备管理实施方案
2014/05/31 职场文书
毕业生自我鉴定范文
2019/05/13 职场文书
浅谈Redis 中的过期删除策略和内存淘汰机制
2022/04/03 Redis