1

是我还是在 python 中打开或关闭文件使用不同的方法使其真的不直观?有更好的方法吗?

例子:

f = open('file.txt', 'r')
try:
# do stuff with f
finally:
   f.close()

现在,为什么我使用内置的“函数”打开但关闭文件我没有函数“关闭”但我必须调用“对象”方法“关闭”。

4

2 回答 2

6

使用with关键字使其更直观。当您删除时,它会自动关闭文件。从文档:

'with' 语句澄清了以前使用 try...finally 块的代码,以确保执行清理代码。

...

执行此语句后, f 中的文件对象将自动关闭,即使 for 循环在该块的中途引发了异常。

一个例子:

with open('file.txt', 'r') as f:
    # do stuff with f

# Do some other stuff - we dropped down a level of indentation, so the file is closed

更具体地说,它最初会调用上下文的__enter__方法——这会执行初始文件打开。__enter__使用as语句设置返回的任何内容- 在这种情况下,文件返回self并将设置为f. 当with块完成时,它将调用上下文的__exit__方法。对于文件上下文,这将执行finally关闭文件的正常块处理。

请注意,该with块不会为您处理异常,它只是确保__exit__被调用(并且将优雅地关闭文件),即使它们确实发生了。因此,如果您有一段ValueError时间使用该文件,您仍然需要try...catch的一个with块来处理可能对您的计算/脚本/等造成的任何影响。


正如 Marcin 所指出的,大多数语言都在一个try...catch...finally块中执行此操作。例如,Java 就是这样做的:

BufferedReader reader = null;
try {
    reader = new BufferedReader(new File("file.txt"));
    // Read in data and do stuff
} catch (Exception e) {
    // Shouldn't be this generic, but you get the idea
    e.printStackTrace();
} finally {
    // Always executes
    if (reader != null) reader.close();
}
于 2013-06-03T18:29:06.327 回答
2

这也是一样的:

with open('file.txt', 'r') as f:
    # do stuff
于 2013-06-03T18:29:03.447 回答