#转载请留言联系

很多人平时需要打开文件进行读取写入操作时,通常这样:

f = open('文件路径','w')
f.write(data)
f.close

这样写有一个潜在的问题,如果在调用 write 的过程中,出现了异常进而导致后续代码无法继续执行,close 方法无法被正常调用,因此资源就会一直被该程序占用者释放。那么该如何改进代码呢?

对于系统资源如文件、数据库连接、socket 而言,应用程序打开这些资源并执行完业务逻辑之后,必须做的一件事就是要关闭(断开)该资源。

比如 Python 程序打开一个文件,往文件中写内容,写完之后,就要关闭该文件,否则会出现什么情况呢?极端情况下会出现 "Too many open files" 的错误,因为系统允许你打开的最大文件数量是有限的。总之,能够将打开使用的资源 进行自动关闭是一个非常不错的手段。

那么,怎么才能在不需要的时候自动关闭呢?很简单,用with。

with open('文件路径','w') as f
f.write(data)

with的原理到底是什么呢?怎么这么神奇?

其实它是通过上下文管理器实现这么一个功能的。

上下文管理器是什么东西呢?其实上下文管理器和迭代器有点相似。任何实现了 __enter__() 和 __exit__() 方法的对象都可称之为上下文管理器   ,上下文管理器可以使用with简化操作。

现在来写一个实现文件自动关闭的上下文管理器~

class File():
def __init__(self,file_name,mode):
self.file_name = file_name
self.mode = mode def __enter__(self):
"""上文"""
self.file_name = open(self.file_name,self.mode)
return self.file_name def __exit__(self, exc_type, exc_val, exc_tb):
"""下文"""
self.file_name.close() with File('./one.txt','w') as f: #正文
f.write("大家好")

“上文”和“下文”对应类中的__enter__和__exit__函数。“正文”就是你的文件处理部分啦。

最新文章

  1. 小白死去活来的安装ros_qtc_plugin
  2. poj 1466 Girls and Boys(二分图的最大独立集)
  3. elasticsearch的rest搜索--- 安装
  4. 大数据Hadoop学习之了解Hadoop(1)
  5. JS 装饰器解析
  6. linux系统安装mysql
  7. IP通信基础课堂笔记----第二章(重点)
  8. JavaSE学习总结(三)——Java语言编程练习、格式化字符与常量
  9. hdu1875 畅通工程再续 并查集/最小生成树
  10. Python相关在线文档手册地址
  11. BZOJ3996:[TJOI2015]线性代数(最大权闭合子图)
  12. Android学习之AutoCompleteTextView
  13. PhoneGap安装配置
  14. 2016.6.19——C++杂记
  15. 《Android源码设计模式》----面向对象六大原则
  16. hdu4565矩阵快速幂
  17. mysql中int、bigint、smallint 和 tinyint的区别与长度的含义【转】
  18. OpenWrt架设nginx php网站
  19. 上传web端——个人项目
  20. SIG蓝牙mesh笔记5_Provisionging

热门文章

  1. linux学习(一)——学习之路
  2. NO9——线段相关
  3. Camera2与TextureView使用
  4. javascript实现自动切换焦点功能学习
  5. WIN8/8.1/10换系统常见的几个问题
  6. hdu2421(数学,因式分解素数筛)
  7. 对于response.setContentType(MIME)的解释
  8. Luogu2662 牛场围栏(最短路)
  9. JS格式化 /Date(xxxxxx)/的日期类型
  10. The xor-longest Path [Trie]