读取文件内容:
data = open(filename, "r").read()
打开的文件立即停止被任何地方引用,所以该文件对象最终会关闭...它不应该影响正在使用它的其他程序,因为该文件仅用于读取,而不是写入。
编辑:这实际上在我编写的一个项目中给我带来了麻烦-这促使我提出了此问题。只有当你的内存耗尽时,文件对象才会被清除,而不是当你的文件句柄用尽时。因此,如果你这样做得太频繁,你可能会用尽文件描述符,并导致你试图打开文件的IO操作抛出异常。
读取文件内容:
data = open(filename, "r").read()
打开的文件立即停止被任何地方引用,所以该文件对象最终会关闭...它不应该影响正在使用它的其他程序,因为该文件仅用于读取,而不是写入。
编辑:这实际上在我编写的一个项目中给我带来了麻烦-这促使我提出了此问题。只有当你的内存耗尽时,文件对象才会被清除,而不是当你的文件句柄用尽时。因此,如果你这样做得太频繁,你可能会用尽文件描述符,并导致你试图打开文件的IO操作抛出异常。
只是为了记录: 这个方法略微长一点,但会立即关闭文件:
from __future__ import with_statement
with open(filename, "r") as f:
data = f.read()
import
,以防他们使用 Python 2.5 :) - Andrew Harewith
的一个作用是将所有处理限制在一个整洁的范围内。将 with open() as f: f.read()
放入一行中有点违背了 with
的作用。 - S.Lottwith
的意图是在一个紧密绑定的上下文中读取和处理数据。使用一行 with this as that: variable = that.read()
的问题是,现在你从 with 块中获得了副作用,失去了整洁的绑定。 - S.Lott确实,它最终会关闭,但“最终”可能不够快。特别是如果您在循环内使用它,系统可能会在GC处理文件对象之前耗尽文件句柄。
虽然您的代码确实按照您所说的方式工作,但它仍然是不良风格。您的代码依赖于可能现在是正确的假设,但将来不一定是正确的。有可能在运行您的代码时,文件被打开而没有关闭会很重要。难道为了节省1或2行代码,冒这个风险真的值得吗?我认为不值得。
不,根据您的推理,我认为这是完全合理的Python风格。
更新:这里有很多关于文件对象是否立即清理的评论。与其猜测,我做了一些调查。这是我看到的:
object.h
的注释中:
宏Py_INCREF(op)和 Py_DECREF(op)用于增加或 减少引用计数。当引用计数降至0时,Py_DECREF 调用对象的析构函数
查看Python的fileobject.c
:
文件对象的函数表指向函数file_dealloc
。这个函数
调用close_the_file
,然后关闭文件。
import this
),"显式优于隐式",通过未明确关闭文件,您可能会让维护您代码的人感到困惑。明确是非常有帮助的!Python 鼓励明确的风格。
除此以外,在一个临时脚本中,您的风格是合理的。
也许您可以从这个答案中受益。
对我来说看起来很好。我经常读这样的文件。