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

Python打开和关闭文件-不直观,python,python-2.7,Python,Python 2.7,是我还是用python打开或关闭一个文件使用了不同的方法,使得它真的不直观? 有更好的方法吗 例如: f = open('file.txt', 'r') try: # do stuff with f finally: f.close() 现在,为什么我使用内置的“函数”打开,但要关闭文件,我没有函数“关闭”,但我必须调用“对象”方法“关闭” 这与此相同: with open('file.txt', 'r') as f: # do stuff 这是同样的: with open('

是我还是用python打开或关闭一个文件使用了不同的方法,使得它真的不直观? 有更好的方法吗

例如:

f = open('file.txt', 'r')
try:
# do stuff with f
finally:
   f.close()
现在,为什么我使用内置的“函数”打开,但要关闭文件,我没有函数“关闭”,但我必须调用“对象”方法“关闭”

这与此相同:

with open('file.txt', 'r') as f:
    # do stuff
这是同样的:

with open('file.txt', 'r') as f:
    # do stuff
使用关键字使其更加直观。当您退出时,它将自动关闭该文件。从文档中:

“with”语句澄清了以前使用try…finally块来确保执行清理代码的代码

执行此语句后,f中的file对象将自动关闭,即使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
更具体地说,它将首先调用上下文的方法-这会打开初始文件。使用
as
语句设置
\uuuuuu enter\uuuu
返回的内容-在这种情况下,文件返回
self
,并将其设置为
f
。当
with
块完成时,它将调用上下文的方法。对于文件上下文,这将执行关闭文件的正常
最终
块处理

请注意,
with
块不会为您处理异常,它只会确保调用
\uuuuuuuuuuuuuu
(这将优雅地关闭文件),即使它们确实发生了。因此,如果您在处理文件时遇到
ValueError
,您仍然需要在
with
块中使用
try…catch
块来处理可能对您的计算/脚本等造成的任何影响


正如Marcin所指出的,大多数语言都是在一个
try…catch…finally
块中实现的。例如,Java可以做到这一点:

BufferedReader读取器=null;
试一试{
reader=new BufferedReader(新文件(“File.txt”);
//读入数据并做一些事情
}捕获(例外e){
//不应该是一般的,但你明白了
e、 printStackTrace();
}最后{
//总是执行
if(reader!=null)reader.close();
}
使用关键字使其更加直观。当您退出时,它将自动关闭该文件。从文档中:

“with”语句澄清了以前使用try…finally块来确保执行清理代码的代码

执行此语句后,f中的file对象将自动关闭,即使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
更具体地说,它将首先调用上下文的方法-这会打开初始文件。使用
as
语句设置
\uuuuuu enter\uuuu
返回的内容-在这种情况下,文件返回
self
,并将其设置为
f
。当
with
块完成时,它将调用上下文的方法。对于文件上下文,这将执行关闭文件的正常
最终
块处理

请注意,
with
块不会为您处理异常,它只会确保调用
\uuuuuuuuuuuuuu
(这将优雅地关闭文件),即使它们确实发生了。因此,如果您在处理文件时遇到
ValueError
,您仍然需要在
with
块中使用
try…catch
块来处理可能对您的计算/脚本等造成的任何影响


正如Marcin所指出的,大多数语言都是在一个
try…catch…finally
块中实现的。例如,Java可以做到这一点:

BufferedReader读取器=null;
试一试{
reader=new BufferedReader(新文件(“File.txt”);
//读入数据并做一些事情
}捕获(例外e){
//不应该是一般的,但你明白了
e、 printStackTrace();
}最后{
//总是执行
if(reader!=null)reader.close();
}

我想补充一点,在大多数其他有异常处理的语言中,try/catch方式是常见的。@Marcin类似于现在末尾的位吗?我想补充一点,try/catch方式在大多数有异常处理的语言中是常见的。@Marcin类似于现在末尾的位吗?把
open
想象成一个构造函数(在Python2.x中,它是
文件
类型的近义词。)将
打开
视为构造函数(在Python2.x中,它是
文件
类型的近义词)。