如果我有:
#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不是句柄?
谢谢
答案 0 :(得分:7)
使用
var dId ='milk';
它不仅关于自动关闭,还关于在例外的情况下正确关闭。
在处理文件时,最好使用
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()
谢谢。