Python 文件读取
自动关闭文件
try..finally 也行。但是 with 更好
流对象有一个显式的 close()方法,但是如果代码有缺陷,在调用 close()方法以前就崩溃了呢?理论上,那个文件会在相当长的一段时间内一直打开着,这是没有必要地。当你在自己的机器上调试的时候,这不算什么大问题。但是当这种代码被移植到服务器上运行,也许就得三思了。
对于这种情况,Python 2 有一种解决办法:try..finally 块。这种方法在 Python 3 里仍然有效,也许你可以在其他人的代码,或者从比较老的被移植到 Python 3 的代码中看到它。但是 Python 2.5 引入了一种更加简洁的解决方案,并且 Python 3 将它作为首选方案:with 语句。
with open('examples/chinese.txt', encoding='utf-8') as a_file: a_file.seek(17) a_character = a_file.read(1) print(a_character)
这段代码调用了 open()函数,但是它却一直没有调用 a_file.close()。with 语句引出一个代码块,就像 if 语句或者 for 循环一样。在这个代码块里,你可以使用变量 a_file 作为 open()函数返回的流对象的引用。所以流对象的常规方法都是可用的 — seek(),read(),无论你想要调用什么。当 with 块结束时,Python 自动调用 a_file.close()。
这就是它与众不同的地方:无论你以何种方式跳出 with 块,Python 会自动关闭那个文件…即使是因为未处理的异常而“exit”。是的,即使代码中引发了一个异常,整个程序突然中止了,Python 也能够保证那个文件能被关闭掉。
从技术上说,with 语句创建了一个运行时环境(runtime context)。在这几个样例中,流对象的行为就像一个上下文管理器(context manager)。Python 创建了 a_file,并且告诉它正进入一个运行时环境。当 with 块结束的时候,Python 告诉流对象它正在退出这个运行时环境,然后流对象就会调用它的 close()方法。请阅读 附录 B,能够在 with 块中使用的类以获取更多细节。
with 语句不只是针对文件而言的;它是一个用来创建运行时环境的通用框架(generic framework),告诉对象它们正在进入和离开一个运行时环境。如果该对象是流对象,那么它就会做一些类似文件对象一样有用的动作(就像自动关闭文件)。但是那个行为是被流对象自身定义的,而不是在 with 语句中。还有许多跟文件无关的使用上下文管理器(context manager)的方法。在这章的后面可以看到,你甚至可以自己创建它们。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

上一篇: 简易 PHP 模板引擎
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论