Python 如果你';使用'重新打开文件;与';语句,是否仍需要关闭文件对象?

Python 如果你';使用'重新打开文件;与';语句,是否仍需要关闭文件对象?,python,file,import,Python,File,Import,对于打开文件,我习惯了明显较旧的语法: f = open("sub_ranks.txt","r+") for line in f: ... f.close() 有几次我被告知要用这种语法来代替 with open("sub_ranks.txt", "r+") as f: for line in f: ... 在第二个示例中,当使用“with”语句时,是否仍需要文件对象“close”语句 如果是的话,有没有具体的理由使用“with”语句来读取文件?在本例中,它(

对于打开文件,我习惯了明显较旧的语法:

f = open("sub_ranks.txt","r+")
for line in f:
    ...
f.close()
有几次我被告知要用这种语法来代替

with open("sub_ranks.txt", "r+") as f:
    for line in f:
        ...
在第二个示例中,当使用“with”语句时,是否仍需要文件对象“close”语句


如果是的话,有没有具体的理由使用“with”语句来读取文件?在本例中,它(稍微)更详细。

从python文档中,我看到with是try/finally块的语法糖。 所以

没有

从Python文档中:

“with”语句澄清了以前将使用的代码 try…finally块以确保执行清理代码。在这个 第节,我将讨论该语句,因为它通常会被使用。在里面 在下一节中,我将研究实现细节并说明如何实现 写入与此语句一起使用的对象

“with”语句是一种控制流结构,其基本结构 是:

带表达式[作为变量]:带块

表达式将被计算,它将生成一个 支持上下文管理协议(即,hasenter()和 退出()方法)


另一篇文章清楚地说明了这一点。

对于你眼前的问题,答案是“不”。
with
块确保当控件离开块时,无论出于何种原因(包括异常情况,不包括有人猛拉计算机电源线和其他一些罕见事件),文件都将关闭

因此,最好将
块一起使用

现在可以说,打开一个文件只是为了读取,但没有关闭它并不是什么大问题。当垃圾收集出现时(无论何时),如果不再有对该文件的引用,该文件也将被关闭;最迟在程序退出时发生。事实上,官方文档中的几个代码示例忽略了关闭仅为读取访问而打开的文件。在编写文件或使用示例中的“read plus”模式时,您肯定需要关闭文件。由于未能正确关闭不完整/损坏的文件,因此她在处理这些文件时遇到了许多问题。

假设您要打印主机名,如下所示:

with open("/etc/hostname","r") as f: print f.read() 

它将打开文件,执行其工作,然后关闭文件。

with
语句是一个紧凑的语句,它将文件的打开和文件处理以及内置异常处理结合在一起

打开(文件名,文件模式)作为文件对象:
#操纵
因此,在这两种情况下,with都会自动关闭文件:

  • 在成功编译块之后
  • 或者如果它遇到错误
注意:如果您不想使用
with
语句,则始终可以使用
try and except
来明确处理异常

试试看:
#你想跑的代码
除EOFError外:
filehandle.close()
类似于
with open("/etc/hostname","r") as f: print f.read()