【问题标题】:for line in open(filename)对于打开的行(文件名)
【发布时间】:2009-09-25 17:47:07
【问题描述】:

我经常看到类似于

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

什么时候文件名会被这段代码关闭?

写出来会更好

with open(filename) as f:
    for line in f.readlines():
        do_something(line)

【问题讨论】:

    标签: python file garbage-collection


    【解决方案1】:

    filename 超出范围时将被关闭。这通常是方法的结束。

    是的,最好使用with

    一旦你有了一个文件对象,你就可以通过调用这个对象的方法来执行所有的文件 I/O。 [...] 完成文件后,您应该通过在对象上调用 close 方法来关闭与文件的连接:

    input.close()
    

    在简短的脚本中,人们经常省略这一步,因为 Python 在垃圾回收期间回收文件对象时会自动关闭文件(这在主流 Python 中意味着文件几乎立即关闭,尽管其他重要的 Python 实现,例如如 Jython 和 IronPython,有其他更宽松的垃圾收集策略)。尽管如此,尽快关闭文件是一种很好的编程习惯,在较大的程序中尤其是一个好主意,否则可能会面临更多无用的打开文件的风险。请注意,try/finally 特别适合确保关闭文件,即使函数因未捕获的异常而终止。

    Python Cookbook, Page 59.

    【讨论】:

    • 我认为你的意思是 f 而不是 filename in "filename would be closed..."
    • 我的意思是用open(filename)创建的对象会在超出范围时关闭,即迭代结束时。
    • 会在for循环结束或者相关方法结束时关闭?
    • 取决于GC,但我相信当循环在CPython上结束时它会关闭(稍后会检查它何时被GCd)
    • @EstebanKüber 我仍然不明白为什么使用“with”更好。一旦循环正常或异常结束,第一种方法似乎也会自动关闭连接。你能解释一下吗?非常感谢。
    【解决方案2】:

    删除.readlines()。对于大文件(由于内存消耗),这是多余的和不可取的。带有'with' 块的变体总是关闭文件。

    with open(filename) as file_:
        for line in file_:
            do_something(line)
    

    何时在裸 'for'-loop 变体中关闭文件取决于 Python 实现。

    【讨论】:

    • Dex 不久前提到消除 readlines()。 >>取决于 Python 实现>>这可能是不同的人给出不同答案的原因。
    【解决方案3】:

    with 部分更好,因为它会在之后关闭文件。 您甚至不必使用readlines()for line in file 就够了。

    我认为第一个不会关闭它。

    【讨论】:

      【解决方案4】:

      python 是垃圾收集器 - cpython 具有引用计数和备份循环检测垃圾收集器。

      文件对象在被删除/完成时关闭它们的文件句柄。

      因此文件最终将被关闭,并且在 cpython 中将在 for 循环完成后立即关闭。

      【讨论】:

        猜你喜欢
        • 2011-06-19
        • 2021-09-03
        • 2012-02-26
        • 1970-01-01
        • 1970-01-01
        • 2014-02-28
        • 2010-09-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多