如果在Python中使用“print”打开了文件,是否需要关闭文件?

3

我通常使用:

f = open(path,'w')
print >> f, string
f.close()

然而,我在别人的代码中看到了以下内容:
print >> open(path,'w'), string

同样也可以很好地工作。

那么,如果文件是用“print”打开的,我们就不必关闭它吗?


无论您如何使用open()的结果,它仍然是一个打开的文件对象,无论上下文如何。 - Martijn Pieters
4
始终使用with。有关更多信息,请参阅PEP343。 - aldeb
@MartijnPieters,所以第二个用法是错误的吗? - bayesrule
是的。第二个用法是错误的。 - aldeb
@HaoLiu:我的意思是使用print >>与在任何其他上下文中使用打开文件没有区别。请参阅链接的重复帖子,了解您没有明确关闭的打开文件发生的情况的详细信息。 - Martijn Pieters
1
这是一个独特的问题,因为它询问的是是否有关于print语句的异常。 - Raymond Hettinger
1个回答

9
是的,您仍然需要关闭文件。与print没有区别。
关闭文件将刷新数据到磁盘并释放文件句柄。
在CPython中,当f的引用计数降至零时,系统会自动执行此操作。在PyPy、IronPython和Jython中,您需要等待垃圾回收器运行(以进行自动文件关闭)。为了避免依赖内存管理器自动关闭而采取脆弱的做法,最好的做法是由您控制文件的关闭。
由于显式关闭文件是最佳实践,Python为文件对象提供了一个上下文管理器,使它非常容易:
with open(path, 'w') as f:
    print >> f, string

当你离开with语句块的主体部分时,这将关闭你的文件。


3
感谢你详细介绍了不仅限于CPython的内容。 - eandersson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接