文件打开:这是不好的Python风格?

时间:2009-09-03 14:17:26

标签: python file file-io coding-style

要阅读文件的内容:

data = open(filename, "r").read()

打开的文件立即停止在任何地方被引用,因此文件对象最终将关闭...并且它不应该影响使用它的其他程序,因为该文件仅用于读取而不是写入。

编辑:这实际上在我写的一个项目中咬了我 - 它促使我问this问题。只有在内存不足时才清理文件对象,而不是在文件句柄用完时清理。因此,如果您经常这样做,最终可能会耗尽文件描述符并导致IO尝试打开文件以引发异常。

6 个答案:

答案 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,然后关闭文件。

<小时/> 因此,在CPython上,当没有时,似乎有理由说明 对文件对象的更多引用,它没有任何延迟地关闭。如果您认为这种解释是错误的,请发表评论,说明您为什么这样做。

答案 4 :(得分:2)

即使它按预期工作,我认为它有两个方面失败:

  1. 您的代码无法无缝扩展,因为您正在将整个文件读入内存,这可能是您想要的也可能不是。
  2. 根据Python的Zen(在Python提示符中尝试import this来检索它)“显式优于隐式”,并且由于未能明确关闭文件,您可能会混淆某人, ,将留下您的维护代码。
  3. 这真的有助于明确! Python鼓励明确的风格。

    除此之外,对于一次性剧本,你的风格是有道理的。

    也许您会从this answer中受益。

答案 5 :(得分:1)

对我来说很好..我经常读这样的文件。