Python 文件读取

发布于 2023-10-06 09:15:57 字数 1332 浏览 26 评论 0

自动关闭文件

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

誰認得朕

暂无简介

文章
评论
27 人气
更多

推荐作者

櫻之舞

文章 0 评论 0

弥枳

文章 0 评论 0

m2429

文章 0 评论 0

野却迷人

文章 0 评论 0

我怀念的。

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文