for open in line(filename)

foo*_*ion 29 python garbage-collection file

我经常看到类似的python代码

for line in open(filename):
    do_something(line)
Run Code Online (Sandbox Code Playgroud)

文件名何时被此代码关闭?

写作会更好吗?

with open(filename) as f:
    for line in f.readlines():
        do_something(line)
Run Code Online (Sandbox Code Playgroud)

Est*_*ber 36

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

是的,最好使用with.

获得文件对象后,可以通过调用此对象的方法来执行所有文件I/O. [...]完成文件后,您应该通过调用close对象上的方法来完成,以关闭与文件的连接:

input.close()
Run Code Online (Sandbox Code Playgroud)

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

Python Cookbook,第59页.

  • 我认为你的意思是“文件名将被关闭......”中的“f”而不是“文件名” (2认同)
  • 当for循环结束或相关方法结束时它会被关闭吗? (2认同)

Loï*_*lff 8

with部分更好,因为它之后关闭文件.你甚至不必使用readlines().for line in file足够.

我不认为第一个关闭它.


jfs*_*jfs 6

下降.readlines().对于大型文件(由于内存消耗),它是多余的并且是不合需要的.带'with'块的变体总是关闭文件.

with open(filename) as file_:
    for line in file_:
        do_something(line)
Run Code Online (Sandbox Code Playgroud)

当文件将在裸'for'循环变体中关闭时,取决于Python的实现.