要阅读文件的内容:
data = open(filename, "r").read()
打开的文件立即停止在任何地方被引用,因此文件对象最终将关闭...并且它不应该影响使用它的其他程序,因为该文件仅用于读取而不是写入。
编辑:这实际上在我写的一个项目中咬了我 - 它促使我问this问题。只有在内存不足时才清理文件对象,而不是在文件句柄用完时清理。因此,如果您经常这样做,最终可能会耗尽文件描述符并导致IO尝试打开文件以引发异常。答案 0 :(得分:30)
仅供记录: 这只是稍微长一点,并立即关闭文件:
from __future__ import with_statement
with open(filename, "r") as f:
data = f.read()
答案 1 :(得分:7)
它确实会最终关闭,但最终可能不会很快。特别是如果你在循环中使用它,系统可能会在GC到达文件对象之前耗尽文件句柄。
答案 2 :(得分:4)
代码完全按照你的说法工作,但它仍然是糟糕的风格。您的代码依赖于现在可能正确的假设,但并非总是如此。在打开文件而不是关闭 的情况下运行代码并不是不可能的。保存1或2行代码真的值得冒这个风险吗?我不这么认为。
答案 3 :(得分:3)
不,根据你的推理,这是完全合理的Python风格的IMO。
更新:此处有很多关于文件对象是否立即整理的评论。而不是推测,我做了一些挖掘。这是我看到的:
<小时/> 来自Python的object.h
:中的评论
宏Py_INCREF(op)和 Py_DECREF(op)用于递增或 减少参考计数。 Py_DECREF 调用对象的解除分配器 当refcount降为0时的函数
查看Python的fileobject.c
:
文件对象的函数表指向函数file_dealloc
。这个功能
调用close_the_file
,然后关闭文件。
答案 4 :(得分:2)
即使它按预期工作,我认为它有两个方面失败:
import this
来检索它)“显式优于隐式”,并且由于未能明确关闭文件,您可能会混淆某人, ,将留下您的维护代码。这真的有助于明确! Python鼓励明确的风格。
除此之外,对于一次性剧本,你的风格是有道理的。
也许您会从this answer中受益。
答案 5 :(得分:1)
对我来说很好..我经常读这样的文件。