如果您使用'打开文件,请使用'声明,你还需要关闭文件对象吗?

时间:2014-01-22 06:33:52

标签: 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”语句进行文件读取?在这种情况下,它(稍微)更详细。

4 个答案:

答案 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()