|
|
51CTO旗下网站
|
|
移动端

3.4 上下文管理器与 with语句

《自学Python:编程基础、科学计算及数据分析》第3章Python 进阶,在本章中,我们将学习 Python的一些进阶用法,包括函数的进阶,迭代器、生成器、装饰器、上下文管理器的使用,以及 Python中的变量作用域。本节为大家介绍上下文管理器与 with语句。

作者:李金来源:机械工业出版社|2018-05-04 13:44

3.4 上下文管理器与 with语句

之前在介绍文件读写的时候我们说过,当一个文件打开的时候,可能会遇到不正常关闭的问题,这样可能会影响我们读写文件。

不仅是文件,当我们处理资源的时候都可能会遇到这样的问题,这些资源包括文件、线程、数据库、网络连接等等。

写入文件时,如果文件没有被正常关闭,会导致某些内容没有来得及写入的情况。

例如,用一个循环向文件中写入数据:

  1. In [1]: f = open('tmp.txt', 'w')  
  2. In [2]: for i in range(1000):  
  3. ...: f.write("line {}\n".format(i))  
  4. ...: j = i / (i-500)  
  5. ...:  
  6. -----------------------------------------------------------------------  
  7. ZeroDivisionError Traceback (most recent call last)  
  8. <ipython-input-2-c31065f93e0b> in <module>()  
  9. 1 for i in range(1000):  
  10. 2 f.write("line {}\n".format(i))  
  11. ----> 3 j = i / (i-500)  
  12. ZeroDivisionError: float division by zero 

当 i循环到 500的时候抛出了一个 ZeroDivisionError,程序中断,上一行应该执行了写入“line 500”的操作。

打开这个文件,我们可能在文件结尾会看到类似如下的情况:

  1. ...  
  2. line 465  
  3. line 466  
  4. lin 

对于上面的情况,可以采用 try块的方式,在 finally中确保文件f被正确关闭:

  1. In [3]: f = open('tmp.txt', 'w')  
  2. In [4]: try:  
  3. ...: for i in range(1000):  
  4. ...: f.write("line {}\n".format(i))  
  5. ...: j = i / (i-500)  
  6. ...: finally:  
  7. ...: f.close()  
  8. -----------------------------------------------------------------------  
  9. ZeroDivisionError Traceback (most recent call last)  
  10. <ipython-input-4-3ad22f37d375> in <module>()  
  11. 2 for i in range(1000):  
  12. 3 f.write("line {}\n".format(i))  
  13. ----> 4 j = i / (i-500)  
  14. 5 finally:  
  15. ZeroDivisionError: integer division or modulo by zero 

finally能够保证f.close()正常执行。

打开文件会发现,文件的结尾保存的是正常的结果:

  1. ...  
  2. line 499  
  3. line 500 

资源使用的问题十分常见,都使用 try块处理显得不够简洁。为此,Python提供了上下文管理器的机制来解决这个问题,它通常与关键字with一起使用。

对于上面的例子,我们用with语句调用的方式为:

  1. In [5]: with open('tmp.txt', 'w') as f:  
  2. ...: for i in range(1000):  
  3. ...: f.write("line {}\n".format(i))  
  4. ...: j = i / (i - 500)  
  5. ...: 

这与使用try块的效果相同,但是简洁了许多。


喜欢的朋友可以添加我们的微信账号:

51CTO读书频道二维码


51CTO读书频道活动讨论群:365934973

【责任编辑:book TEL:(010)68476606】

回书目   上一节   下一节
点赞 0
分享:
大家都在看
猜你喜欢

读 书 +更多

网管第一课——网络组建与管理

本书针对初级网管朋友所需掌握的网络组建和网络管理技能,以示例方式编写而成,其主要特点就是实用性和可操作性非常强。 全书共分8章,分...

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊