【发布时间】:2011-06-03 18:05:06
【问题描述】:
我认为这个问题更多的是“编码风格”而不是技术问题。
说我有一行代码:
buf = open('test.txt','r').readlines()
...
文件描述符会自动关闭,还是留在内存中? 如果文件描述符没有关闭,关闭它的首选方法是什么?
【问题讨论】:
标签: python file-io coding-style
我认为这个问题更多的是“编码风格”而不是技术问题。
说我有一行代码:
buf = open('test.txt','r').readlines()
...
文件描述符会自动关闭,还是留在内存中? 如果文件描述符没有关闭,关闭它的首选方法是什么?
【问题讨论】:
标签: python file-io coding-style
如果将文件对象分配给变量,则可以使用.close() 显式关闭它
f = open('test.txt','r')
buf = f.readlines()
f.close()
或者(更普遍地首选),您可以使用Python docs 中提到的with 关键字(Python 2.5 和更高版本):
最好使用
with处理文件时的关键字 对象。这样做的好处是 文件在完成后正确关闭 套件完成,即使出现异常 在途中提出。也是很多 比写作短 try-finally 块:
>>> with open('test.txt','r') as f:
... buf = f.readlines()
>>> f.closed
True
【讨论】:
with 在 2.5 中可用,但您需要使用 from __future__ import with_statement 导入它。从 2.6 开始,这不是必需的。
通常在 CPython 中,当引用计数降至零时,文件会立即关闭(尽管未来版本的 CPython 不保证这种行为)
在其他实现中,例如 Jython,文件在被垃圾回收之前不会关闭,这可能需要很长时间。
根据实现的行为不同,代码的工作方式不同,这是一种糟糕的风格。
如果它只是用于快速脚本或您在解释器外壳中尝试的东西,那就足够了,但对于任何类型的生产工作,您通常应该使用上下文管理器,如 Falmarri 的回答中所述
【讨论】:
它将一直保留在内存中,直到垃圾收集器将其关闭。您应该始终明确关闭文件描述符。只需执行以下操作:
with open('test.txt', 'r') as f:
buf = f.readlines()
【讨论】:
它会自动关闭,但具体时间取决于实现。显式使用 with 块会更好,但如果您只是为自己编写一个偶尔运行的小脚本,这并不重要。
【讨论】:
您也可以尝试使用 os.close(fd) 方法。
【讨论】: