如果你一次读完整个文件需要声明吗?

时间:2013-10-28 12:04:47

标签: python with-statement

我从12年开始使用这个:

content=open(foo).read()

来自大学的新同事说:你应该使用with声明。

with open(foo) as fd:
    content=fd.read()

我认为没有必要输入超过必要的理由。

with语句给我的唯一好处是:fd在块离开后立即关闭。如果没有with语句,如果垃圾收集器开始执行其工作,则fd将关闭。

请告诉我:如果我一次阅读整个文件,为什么要使用with语句?

更新:我知道with语句是如何工作的,我知道它很有用(例如写入文件)。

5 个答案:

答案 0 :(得分:5)

为了您的目的,没有真正的理由。但是,with的用处并不仅限于文件。它可以与线程一起使用。例如:

import threading
lock = threading.Lock()
with lock:
    # Critical section
    statements
    # End critical section

当控件进入并离开后面的语句块时,with语句会自动获取并释放锁。

使用它成为一种好习惯,因为它为您的代码增加了额外的安全性,并使文件读取部分更加突出和可读(在我看来),因为当您使用with语句时,您基本上在内部缩进块。

答案 1 :(得分:1)

原因很明显:上下文管理器在离开上下文管理器块后关闭,例如打开文件。使用上下文管理器可以提供额外的安

例如我有这段代码:

content = open('foo.txt').read()
os.unlink('foo.txt')

这段代码在Linux上完美运行但在Windows上失败,因为文件仍处于打开状态,Windows导致异常(文件被锁定或类似的东西,据我记得)。

将代码编写为

时,无法执行此错误
with open('foo.txt') as fp:
    content= fp.read()
os.unlink('foo.txt')

在阅读内容之后和尝试取消链接()文件之前,文件将被关闭。

答案 2 :(得分:0)

因为关闭未使用的句柄而不是等待GC是一个好习惯。

顺便说一句,您的观点是正确的,在您的上下文中使用with没有显着的好处。 由于使用with明确关闭,可能不到一毫秒的惩罚。

答案 3 :(得分:0)

您一次读取整个文件对文件关闭时没有影响。无论你对文件做什么(没有明确地关闭它),如果没有with,文件将保持打开状态,直到调用__del__方法。因此,使用with的原因同样适用于您的用例以及文件I / O的每个其他情况:

肯定尽早关闭文件。它不受参考周期的影响,而且它对其他Python实现更具可移植性(想象一下,当你可以从PyPy获得5倍的性能提升而不能使用它时,因为程序因打开太多文件而崩溃!)。即使对于当前上下文无关紧要,代码也会被移动并且需求会发生变化。对于未来的证明代码来说,这是一种简单的方法(只需一行!)。

如果它是一个一次性的脚本,每次运行只打开两个文件,它仍然是好的风格和良好的习惯。同样的原因是您不会在一次性脚本中将缩进更改为五个空格。

答案 4 :(得分:-3)

with语句更好,因为它可以确保您始终关闭文件,即使引发了异常。