上期的答案:
Q:如果在最开始open文件的时候出错了,with还能自动的帮我们关闭文件吗
A:with 不会关闭文件
Q:你认为代码1和代码2是等效的,还是代码1和代码3等效的
代码1:
with open('1234.txt')as f:
data=f.read()
print data
代码2:
f = open('1234.txt')
try:
data = f.read()
print data
finally:
f.close()
代码3:
try:
f = open('1234.txt')
data = f.read()
print data
finally:
f.close()
A:代码1和代码2是等效的
其实这个两个问题的答案是一样的,焦点都在with能否自动关闭文件
我们先回答第二题:
1.我们把代码2,加一行代码
f = open('1234.txt')
try:
data = f.read()
print data
finally:
print 'file status:',f.closed#打印文件关闭状态
f.close()
>>
IOError: [Errno 2] No such file or directory: '1234.txt'
因为'1234.txt'文件根本不存在,所以open的时候就会抛出一个异常,也即是说没有返回对象给f,因为open语句,没有try保护,所以直接触发异常,抛给解释器,所以finally的代码块根本没有运行哦,try没有运行,finally当然不会运行,f没有被close
2.我们把代码3,加一行同样的代码
try:
f = open('1234.txt')
data = f.read()
print data
finally:
print 'file status:',f.closed#打印文件关闭状态
f.close()
>>
file status:
NameError: name 'f' is not defined
因为'1234.txt'文件根本不存在,所以open的时候就会抛出一个异常,也即是说没有返回对象给f,但是open语句在try中,收到了保护,所以触发异常,抛给解释器,只要try的代码运行,无论是正常运行还是有异常发生,finally的代码块都会运行,只是open发生异常了,f还没有来得及赋值,f是空的,没有定义过的
3.我们把代码1,先运行一下
with open('1234.txt')as f:
data=f.read()
print data
>>
IOError: [Errno 2] No such file or directory: '1234.txt'
会不会是因为没有捕获异常,所以我们没有看到文件的关闭状态,好我们加上异常处理
try:
with open('1234.txt') as f:
line=f.read()
print line
except IOError,e:
print 'we catch the error:',e#打印出异常的信息
print 'flie close status:',f.closed#打印出文件的关闭状态
>>
we catch the error: [Errno 2] No such file or directory: '1234.txt'
flie close status:
NameError: name 'f' is not defined
回答第一个问题:with 不会关闭文件,因为with 根本没有成功的打开文件,f也不会被初始化
回答第二个问题: open打开文件失败,会抛出异常,若是跟代码3一样,就会被捕获异常,实际上并没有被捕获,因为f 是空,with 根本没有进入上下文管理器的对象中,去调用__enter()__和__exit()__,而是直接抛出异常,所以跟代码2是一样的
好了异常处理留的2个题目的答案就讲到这里啦,希望能给初学者一些启发,若有什么不懂的,也可以留言跟我探讨交流.
最后说一下,原创真的不易,希望大家能够给点支持,欢迎转发转发转发,留言留言留言,重要的事情说三遍,也是对我的一点鼓励和动力.
也欢迎更多喜欢Python的同学关注 菜鸟学python,一起来学python吧 长按下方的二维码即可关注.