for open in line(filename)

时间:2009-09-25 17:47:08

标签: python file garbage-collection

我经常看到类似于

的python代码
for line in open(filename):
    do_something(line)

使用此代码何时关闭文件名?

会不会更好
with open(filename) as f:
    for line in f.readlines():
        do_something(line)

4 个答案:

答案 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就会关闭。