我认为这个问题更像是一种“编码风格”,而不是技术问题。
说我有一行代码:
buf = open('test.txt','r').readlines()
...
文件描述符会自动关闭,还是会留在内存中? 如果文件描述符没有关闭,关闭它的首选方法是什么?
答案 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)方法。