python关闭文件描述符问题

时间:2011-01-05 01:05:00

标签: python file-io coding-style

我认为这个问题更像是一种“编码风格”,而不是技术问题。

说我有一行代码:

buf = open('test.txt','r').readlines()
...

文件描述符会自动关闭,还是会留在内存中? 如果文件描述符没有关闭,关闭它的首选方法是什么?

5 个答案:

答案 0 :(得分:38)

如果将文件对象分配给变量,则可以使用.close()

显式关闭它
f = open('test.txt','r')
buf = f.readlines()
f.close()

或者(通常更喜欢),您可以使用Python docs中提到的with关键字(Python 2.5及更高版本):

  

优良作法是使用with   处理文件时的关键字   对象。这具有以下优点   文件在其后正确关闭   套件完成,即使例外   在途中被提出来。它也很多   比写同等文字短   try-finally blocks:

>>> with open('test.txt','r') as f:
...     buf = f.readlines()
>>> f.closed
True

答案 1 :(得分:14)

通常在CPython中,当引用计数降至零时,文件立即关闭(尽管未来CPython版本不保证这种行为)

在其他实现中,例如Jython,文件在收集garbarge之前不会关闭,这可能需要很长时间。

根据实现的行为,使代码的工作方式不同是一种糟糕的风格。

如果只是为了一个快速脚本或者你在解释器shell中尝试的东西它已经足够好了,但是对于任何类型的制作工作,你通常应该像Falmarri的答案一样使用上下文管理器

答案 2 :(得分:5)

它将保留在内存中,直到垃圾收集器关闭它。您应该始终显式关闭文件描述符。做这样的事情:

with open('test.txt', 'r') as f:
    buf = f.readlines()

答案 3 :(得分:1)

它将自动关闭,但具体取决于实施时间。显式使用with-block更好,但如果你只为自己编写一个小脚本,偶尔运行它并不重要。

答案 4 :(得分:0)

您也可以尝试使用os.close(fd)方法。