Python打开和关闭文件 - 不直观

时间:2013-06-03 18:27:00

标签: python python-2.7

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

示例:

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

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

2 个答案:

答案 0 :(得分:6)

使用with关键字使其更直观。当你dedent时它会自动关闭文件。来自文档:

  

'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();
}

答案 1 :(得分:2)

这是一样的:

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