上期"深入剖析Python-with的内部原理":两个问题的答案揭晓

浏览: 1334


上期的答案:

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吧 长按下方的二维码即可关注.

推荐 2
本文由 菜鸟学Python 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

1 个评论

谢谢

要回复文章请先登录注册