在这种情况下需要关闭文件吗?

时间:2018-02-27 18:46:35

标签: python file

如果我有:

#include <iostream>
using namespace std;


int main()
{    

int height, width;

cout << "enter width" << endl;
cin >> width;

cout << "enter height" << endl;
cin >> height;

for(int i = 0; i < height; i++) { 

for(int j = 0; j < width; j++) {  
     if( ? ){
                    cout << "*";
                }else{
                    cout << " ";
                }

}
    cout << endl;
}
 return 0;
}

获取数据后文件会自动关闭吗?如果不是,我怎么能关闭它,因为fdata不是句柄?

谢谢

4 个答案:

答案 0 :(得分:7)

使用

      var dId ='milk';

它不仅关于自动关闭,还关于在例外的情况下正确关闭。

Doku:methods of file objects

  

在处理文件时,最好使用with open(pathf, "r") as r: fdata = r.read().splitlines() # as soon as you leave the with-scope, the file is autoclosed, even if exceptions happen. 关键字   对象。优点是文件在其之后正确关闭   即使在某个时刻出现异常,套件也会完成。运用   with也比编写等效的with块短得多:

     

如果您未使用try-finally关键字,则应致电with   关闭文件并立即释放所使用的任何系统资源   它。
  如果你没有显式关闭文件,Python的垃圾收集器   最终会破坏对象并关闭打开的文件,   但文件可能会暂时保持打开状态。另一个风险是不同的   Python实现将在不同时间进行清理。

答案 1 :(得分:3)

如果您使用此:

with open(pathf, 'r') as f:
     fdata = f.read().splitlines()

然后您不必关闭文件,它会自动完成。使用完文件后关闭文件总是很好的做法(降低内存泄漏等风险......)

答案 2 :(得分:3)

  

获取数据后文件会自动关闭吗?

在您的示例中,fdata实际上是一个列表,而不是文件对象。文件对象是open()返回的内容。

如果你有一个绑定到文件对象的名称或者fdata是一个文件对象,答案就是它取决于

如果文件对象没有任何引用,即它的引用计数达到0,它将被垃圾收集,因此将在此过程中被销毁。

  

如果不能,我怎么能关闭它,因为fdata不是句柄?

你不能因为fdata不是文件对象(就像你提到的那样)而你也没有对open()返回的文件对象的任何引用。

如果您有文件对象,则可以在其上明确调用close()

f_object.close()

更好,因为open是一个上下文管理器,使用with ...构造让它在块结束时自动关闭:

with open('file.txt') as f_object:
    ...

一个额外的好处是,如果异常也会关闭文件。如果您有兴趣,请查看__enter__的{​​{1}}和__exit__特殊方法。

答案 3 :(得分:3)

在退出或垃圾回收期间,文件将自动关闭。但是,由于最佳实践很重要,更好的方法是使用上下文管理器,如下所示:

with open(pathf, "r") as f:
    fdata = f.read().splitlines()

谢谢。