我从12年开始使用这个:
content=open(foo).read()
来自大学的新同事说:你应该使用with
声明。
with open(foo) as fd:
content=fd.read()
我认为没有必要输入超过必要的理由。
with
语句给我的唯一好处是:fd
在块离开后立即关闭。如果没有with
语句,如果垃圾收集器开始执行其工作,则fd
将关闭。
请告诉我:如果我一次阅读整个文件,为什么要使用with
语句?
更新:我知道with语句是如何工作的,我知道它很有用(例如写入文件)。
答案 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语句更好,因为它可以确保您始终关闭文件,即使引发了异常。