在开放(文件名)线(for line in open(filename))

2019-07-19 15:46发布

我经常看到类似的Python代码

for line in open(filename):
    do_something(line)

什么时候文件名获得此代码关闭?

它会更好写

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

Answer 1:

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

是的,最好使用with

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

 input.close() 

总之脚本,人们往往忽略这一步,像Python将自动关闭,当垃圾收集(这在主流的Python意味着该文件只是一次关闭时一个文件对象被回收的文件,但其他重要的Python实现,比如Jython和IronPython的,有其他的,更宽松的垃圾收集策略)。 然而,这是良好的编程习惯,以尽快关闭您的文件,它是特别是在较大的程序,否则可能会在具有无益打开文件卧谈数目过多的更大的风险是一个好主意。 需要注意的是try / finally是特别适合于随后的一个文件被关闭,即使当函数结束,由于未捕获到异常。

Python的食谱,第59页。



Answer 2:

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

我不认为第一个关闭它。



Answer 3:

掉落.readlines() 它是多余的,不希望的大文件(由于存储器消耗)。 与变体'with'块始终关闭文件。

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

当文件将在裸关闭'for' -loop类型取决于Python实现。



Answer 4:

蟒是垃圾收集 - CPython的具有引用计数和备用周期检测垃圾收集器。

File对象关闭其文件句柄时被删除/敲定。

因此,该文件将最终关闭,并在CPython的将尽快封闭的for循环结束。



文章来源: for line in open(filename)