4

我用这个 12 年了:

content=open(foo).read()

来自大学的新同事说:你应该使用这个with说法。

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

我看不出为什么我应该输入更多的内容。

with声明给我的唯一好处是:fd一旦离开该块,就会关闭。如果垃圾收集器开始执行他的工作,则如果没有该with语句,则会关闭。fd

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

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

4

5 回答 5

5

好吧,出于您的目的,没有真正的理由。然而,withs 的用处并不仅限于文件。它可以与线程一起使用。例如:

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

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

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

于 2013-10-28T12:12:31.203 回答
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')

在读取内容后和尝试 unlink() 文件之前,该文件将被关闭。

于 2013-10-28T12:14:14.337 回答
0

您一次读取整个文件对文件何时关闭没有影响。无论您对文件做什么(没有显式关闭它),在调用它的方法with之前,文件都会保持打开状态。__del__因此,使用withapply 的原因与文件 I/O 的所有其他情况一样多:

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

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

于 2013-10-28T12:41:12.607 回答
0

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

顺便说一句,您的观点是正确的,with在您的上下文中使用没有显着的好处。由于使用with.

于 2013-10-28T12:09:52.553 回答
-3

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

于 2013-10-28T12:17:02.193 回答