对于打开文件,我习惯了显然较旧的语法:
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”语句进行文件读取?在这种情况下,它(稍微)更详细。
答案 0 :(得分:6)
您当前问题的答案是“否”。 with
块确保当控件离开块时文件将被关闭,无论出于何种原因,包括异常(好吧,排除某人将电源线拖到计算机上以及其他一些罕见事件)。
因此,最好使用with
块。
现在可以说,打开一个文件只是为了阅读然后没有关闭它不是那很多问题。当垃圾收集到来时(无论何时可能),如果没有对它的引用,那么该文件也将被关闭;最迟将在您的程序退出时发生。实际上,官方文档中的几个代码示例忽略了关闭仅为读取访问而打开的文件。在编写文件或使用“示例”中的“读取加”模式时,您肯定需要关闭该文件。由于未能正确关闭文件,她在SO上处理不完整/损坏的文件有很多问题。
答案 1 :(得分:2)
从python文档中,我看到with是try / finally块的语法糖。 所以,
Is a file object "close" statement still needed in the second example, when the "with" statement is being used?
没有
来自Python文档:
'with'语句澄清了以前会使用的代码 尝试... finally块以确保执行清理代码。在这 我将讨论通常会使用的声明。在 在下一节中,我将研究实现细节并展示如何 编写用于此语句的对象。
'with'语句是一个控制流结构,其基本结构 是:
表达式[作为变量]:with-block
表达式被计算,它应该产生一个对象 支持上下文管理协议(即输入()和 退出()方法)。
Here是另一篇明确表达的文章。
答案 2 :(得分:1)
没有。
假设您要打印主机名,如下所示:
#include<bits/stdc++.h>
using namespace std;
int sum(int arr[], int n)
{
int sum=0;
for(int i=0; i<n; i++)
{
sum += arr[i];
}
return sum;
}
int main()
{
int arr[] = {1, 2, 3, 4, 5};
int n = distance(begin(arr), end(arr));
int total = sum(arr,n);
printf("%d", total);
return 0;
}
它将打开文件,完成其工作然后关闭文件。
答案 3 :(得分:0)
with
语句是一个紧凑的语句,结合了打开文件和处理文件以及内置异常处理。
with open(filename,file_mode) as file_object:
#do the manipulation
因此在两种情况下都会自动关闭文件:
注意:如果您不想使用 with
语句,那么您始终可以使用 try and except
来显式处理异常。
try :
#code you wanna run
except EOFError:
filehandle.close()