Python关闭文件描述符的问题
我觉得这个问题更像是“编码风格”的问题,而不是技术上的问题。
假设我有一行代码:
buf = open('test.txt','r').readlines()
...
那么这个文件描述符会自动关闭吗?还是会一直留在内存里?如果文件描述符没有关闭,最好的关闭方式是什么呢?
5 个回答
6
这个文件会一直保存在内存里,直到垃圾回收器把它清理掉。你应该总是明确地关闭你的文件描述符。你可以像这样做:
with open('test.txt', 'r') as f:
buf = f.readlines()
17
通常在CPython中,当文件的引用计数降到零时,文件会立即关闭(不过这个行为在未来的CPython版本中可能会有所不同)。
而在其他实现中,比如Jython,文件不会关闭,直到它被垃圾回收,这可能会晚很多。
如果你的代码在不同的实现中表现得不一样,这样的写法是不太好的。
如果只是为了写个简单的脚本或者在解释器中试试,这样就可以了,但如果是用于生产环境,通常应该使用上下文管理器,就像Falmarri的回答中提到的那样。
45
如果你把文件对象赋值给一个变量,你可以通过使用 .close()
来明确地关闭它。
f = open('test.txt','r')
buf = f.readlines()
f.close()
另外(而且更推荐这样做),你可以使用 with
这个关键词(Python 2.5 及以上版本)来处理文件,就像在Python 文档中提到的那样:
在处理文件对象时,使用
with
这个关键词是个好习惯。这样做的好处是文件在使用完后会被正确关闭,即使在过程中出现了错误也没关系。而且,这种写法比写相应的 try-finally 代码块要简洁得多:
>>> with open('test.txt','r') as f:
... buf = f.readlines()
>>> f.closed
True