我经常看到类似于
的python代码for line in open(filename):
do_something(line)
使用此代码何时关闭文件名?
写
会不会更好with open(filename) as f:
for line in f.readlines():
do_something(line)
答案 0 :(得分:36)
filename
超出范围时,它将被关闭。这通常是方法的结束。
是的,最好使用with
。
拥有文件对象后,可以通过调用此对象的方法来执行所有文件I / O. [...]完成文件后,您应该通过调用对象上的
close
方法来完成,以关闭与文件的连接:input.close()
在简短的脚本中,人们经常省略这一步骤,因为Python在垃圾收集期间回收文件对象时自动关闭文件(在主流Python中意味着文件几乎立即关闭,尽管其他重要的Python实现,例如作为Jython和IronPython,有其他更轻松的垃圾收集策略)。然而,尽快关闭文件是一种很好的编程习惯,在大型程序中尤其是一个好主意,否则可能会有更多无用的打开文件的风险。请注意,
try
/finally
特别适合于确保文件被关闭,即使函数因未捕获的异常而终止。
<子> Python Cookbook, Page 59. 子>
答案 1 :(得分:8)
with
部分更好,因为它之后会关闭文件。
您甚至不必使用readlines()
。 for line in file
就足够了。
我不认为第一个关闭它。
答案 2 :(得分:6)
删除.readlines()
。对于大型文件(由于内存消耗),它是多余的并且是不合需要的。具有'with'
块的变体始终关闭文件。
with open(filename) as file_:
for line in file_:
do_something(line)
当文件将在裸'for'
- 循环变体中关闭时,取决于Python的实现。
答案 3 :(得分:3)
python是垃圾收集的--cpython有引用计数和检测垃圾收集器的备份周期。
文件对象在删除/完成时关闭其文件句柄。
因此文件将最终关闭,并且一旦for循环结束,cpython就会关闭。