python文件读写最佳实践(with)
来源:互联网 发布:python define 编辑:程序博客网 时间:2024/06/06 09:04
为了避免忘记或者为了避免每次都要手动关闭文件,我们可以使用with语句(一种语法糖,语法糖语句通常是为了简化某些操作而设计的)。with语句会在其代码块执行完毕之后自动关闭文件。因此我们可以这样来改写上面的程序:
with open('song.txt', 'r', encoding='utf-8') as f: print(f.read())print(f.closed)
输出结果:
匆匆那年我们 究竟说了几遍 再见之后再拖延可惜谁有没有 爱过不是一场 七情上面的雄辩匆匆那年我们 一时匆忙撂下 难以承受的诺言只有等别人兑现True
是不是变得简介多了,代码结构也比较清晰了。with之后打印的f.closed属性值为True,说明文件确实被关闭了。
思考:
with语句会帮我们自动处理异常信息吗?
要回答这个问题就要提到“上下文管理器” 和 with语句的工作流程。
with语句不仅仅可以用于文件操作,它实际上是一个很通用的结构,允许使用所谓的上下文管理器(context manager)。上下文管理器是一种支持__enter__()和__exit__()这两个方法的对象。__enter__()方法不带任何参数,它在进入with语句块的时候被调用,该方法的返回值会被赋值给as关键字之后的变量。__exit__()方法带有3个参数:type(异常类型), value(异常信息), trace(异常栈),当with语句的代码块执行完毕或执行过程中因为异常而被终止都会调用__exit__()方法。正常退出时该方法的3个参数都为None,异常退出时该方法的3个参数会被分别赋值。如果__exit__()方法返回值(真值测试结果)为True则表示异常已经被处理,命令执行结果中就不会抛出异常信息了;反之,如果__exit__()方法返回值(真值测试结果)为False,则表示异常没有被处理并且会向外抛出该异常。
现在我们应该明白了,异常信息会不会被处理是由with后的语句返回对象的__exit__()方法决定的。文件可以被用作上下文管理器。它的__enter__方法返回文件对象本身,__exit__方法会关闭文件并返回None。我们看下file类中关于这两个方法的实现:
def __enter__(self): # real signature unknown; restored from __doc__ """ __enter__() -> self. """ return self def __exit__(self, *excinfo): # real signature unknown; restored from __doc__ """ __exit__(*excinfo) -> None. Closes the file. """ pass
可见,file类的__exit__()方法的返回值为None,None的真值测试结果为False,因此用于文件读写的with语句代码块中的异常信息还是会被抛出来,需要我们自己去捕获并处理。
with open('song.txt', 'r', encoding='utf-8') as f: print(f.read()) num = 10 / 0
输出结果:
匆匆那年我们 究竟说了几遍 再见之后再拖延可惜谁有没有 爱过不是一场 七情上面的雄辩匆匆那年我们 一时匆忙撂下 难以承受的诺言只有等别人兑现Traceback (most recent call last): File "<stdin>", line 3, in <module>ZeroDivisionError: division by zero
注意: 上面所说的__exit__()方法返回值(真值测试结果)为True则表示异常已经被处理,指的是with代码块中出现的异常。它对于with关键字之后的代码中出现的异常是不起作用的,因为还没有进入上下文管理器就已经发生异常了。因此,无论如何,还是建议在必要的时候在with语句外面套上一层try...except来捕获和处理异常。
有关“上下文管理器”这个强大且高级的特性的更多信息,请参看Python参考手册中的上下文管理器部分。或者可以在Python库参考中查看上下文管理器和contextlib部分。
- python文件读写最佳实践(with)
- python 文件读写项目实践
- Python小记--二进制方式文件读写实践
- python 最佳实践总结
- python logging 最佳实践
- Python最佳编码实践
- python logging 最佳实践
- python 最佳实践--编辑器
- PHP最佳实践之读写配置
- 文件读写(python 3.5)
- Python学习(文件读写)
- python--python读写文件
- paip.复制文件 文件操作 api的设计uapi java python php 最佳实践
- 最佳实践(下)
- 最佳实践(中)
- 最佳实践(上)
- Python在Windows环境下处理文件路径问题最佳实践
- paip.python ide 总结最佳实践o4.
- 第一次应聘经历
- Java 集合系列03之 ArrayList详细介绍(源码解析)和使用示例
- 数据库跨库查询
- 求平方和
- C#高级学习第六章网络Socket1-Tcp协议
- python文件读写最佳实践(with)
- centos7 添加用户授予权限
- Ethernet Cable vs. Telephone Cable: Which Is Your Option?
- DI的概念和实现原理—Spring系列介绍
- 环境变量PATH.cp及mv命令
- Spring和Hibernate整合(2)
- Android studio打jar包
- gc原理和java内存泄漏的例子
- 控制反转(IOC)和依赖注入(DI)的区别