鱼C论坛

 找回密码
 立即注册
查看: 1435|回复: 8

[已解决]python关于with语句的求助

[复制链接]
发表于 2019-3-6 19:44:10 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
try:
    with open('data.txt','w') as f:
        for each_line in f:
            print(each_line)
except OSError as reason:
    print('出错啦:' + str(reason))


这里没搞懂这个with语句怎么就自动关闭了已经打开的文件?
比如我后面加个finally:

try:
    with open('data.txt','w') as f:
        for each_line in f:
            print(each_line)
except OSError as reason:
    print('出错啦:' + str(reason))

finally:             ######################我在此处的目的是为了验证这个文件到底关闭了没有
    if 'f' in locals():
        print('yes')


以下是执行结果:
>>>
=============== RESTART: C:\Users\EZZHAHE\Desktop\maxFactor.py ===============
出错啦:not readable
yes
>>>

明显f这个文件依然存在,并没有关闭啊?

没搞懂小甲鱼这里是个什么意思?大佬们给解释一下这个问题,最好详细解释一下with这个语句的使用方法或者给个例子说明一下


最佳答案
2019-3-7 23:35:32

那你是不是应该设为最佳答案呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-3-6 21:22:35 | 显示全部楼层
我觉得你应该这样测试

  1. with open("test1.txt","w") as f:
  2.         f.write("如果test1.txt中出现这段话则有自动保存!")
  3.        
  4. file = open("test2.txt","w")
  5. file.write("由于没有使用close,所以程序结束后数据不会保存!")
复制代码


都没有用close,有没有自动关闭一目了然!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-3-7 00:16:32 | 显示全部楼层
水瓶座 发表于 2019-3-6 21:22
我觉得你应该这样测试

这么测试我是理解的。就是对下面这句不是很透彻:

  1. if 'f' in locals():
复制代码


这句能看出对象f有没有关闭吗?我理解的关闭了就返回False,如果没有关闭则返回True呗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-3-7 12:37:18 | 显示全部楼层
Pyshell 发表于 2019-3-7 00:16
这么测试我是理解的。就是对下面这句不是很透彻:

  1. f = open("test.txt","w")
  2. f.write("test")
  3. f.close()
  4. if "f" in locals():
  5.         print("f的存在与是否关闭文件无关!")
  6.         print(type(f))
复制代码

事实证明你理解错了
无论是否关闭都返回true
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-3-7 16:58:44 | 显示全部楼层
水瓶座 发表于 2019-3-7 12:37
事实证明你理解错了
无论是否关闭都返回true

那么反推的话,如果是我理解错了。
在零基础入门学习python这门课中课后作业第三题小甲鱼给出的答案就是存在问题的.

3. 把文件关闭放在 finally 语句块中执行还是会出现问题,像下边这个代码,当前文件夹中并不存在"My_File.txt"这个文件,那么程序执行起来会发生什么事情呢?你有办法解决这个问题吗?
  1. try:
  2.     f = open('My_File.txt') # 当前文件夹中并不存在"My_File.txt"这个文件T_T
  3.     print(f.read())
  4. except OSError as reason:
  5.     print('出错啦:' + str(reason))
  6. finally:
  7.     f.close()
复制代码


由于finally语句块里试图去关闭一个并没有成功打开的文件,因此会弹出错误内容如下:
  1. >>> 出错啦:[Errno 2] No such file or directory: 'My_File.txt'
  2. Traceback (most recent call last):
  3.   File "C:\Users\FishC000\Desktop\test.py", line 7, in <module>
  4.     f.close()
  5. NameError: name 'f' is not defined
复制代码

我们这么修正:
  1. try:
  2.     f = open('My_File.txt') # 当前文件夹中并不存在"My_File.txt"这个文件T_T
  3.     print(f.read())
  4. except OSError as reason:
  5.     print('出错啦:' + str(reason))
  6. finally:
  7.     if 'f' in locals():
  8.         f.close()
复制代码


上面是小甲鱼给出的答案,按他这个意思,如果试图打开一个不存在的文件。那么在finally语句中if 'f' in locals()就会返回False。如果打开一个存在的文件,那么if条件返回True,执行关闭文件。
这又怎么解释?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-3-7 18:24:02 | 显示全部楼层
本帖最后由 水瓶座 于 2019-3-7 18:25 编辑
Pyshell 发表于 2019-3-7 16:58
那么反推的话,如果是我理解错了。
在零基础入门学习python这门课中课后作业第三题小甲鱼给出的答案就是 ...


首先给你说说运行流程
  1. try:
  2.     f = open('My_File.txt') # 当前文件夹中并不存在"My_File.txt"这个文件T_T
  3.     print(f.read())
  4. except OSError as reason:
  5.     print('出错啦:' + str(reason))
  6. finally:
  7.     f.close()
复制代码

因为"My_File.txt"不存在,所以直接抛出错误,然后跳到except
那么这里发生了什么呢?
  1. f = open('My_File.txt')
复制代码

它一出错就跳到except了
也就是从这行代码的等号右边直接跳到except
所以实际上并没有进行赋值操作,那么f自然也就不存在了
那么finally里的f.close()也自然是不行
就会抛出f未定义的错误
至于这里
  1. try:
  2.     f = open('My_File.txt') # 当前文件夹中并不存在"My_File.txt"这个文件T_T
  3.     print(f.read())
  4. except OSError as reason:
  5.     print('出错啦:' + str(reason))
  6. finally:
  7.     if 'f' in locals():
  8.         f.close()
复制代码

多出的这句
  1. if 'f' in locals():
复制代码

只是判断了f有没有定义,也就是这句
  1. f = open('My_File.txt')
复制代码

有没有执行成功。
而打开一个不存在的文件就是执行到一半跳走了,
自然也就是不成功,也就是返回false啦
如果文件存在,那就是执行成功,完成了赋值,f存在了
也就返回true了

你应该是没理解locals()
locals()返回的是已声明的变量,用小甲鱼的话说就是变量(标签)
如果标签没写好,却试图去使用它,即
  1. f.close()
复制代码

自然是不可以的


啰嗦了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-3-7 19:45:51 | 显示全部楼层
水瓶座 发表于 2019-3-7 18:24
首先给你说说运行流程

因为"My_File.txt"不存在,所以直接抛出错误,然后跳到except

明白啦,多谢~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-3-7 23:35:32 | 显示全部楼层    本楼为最佳答案   

那你是不是应该设为最佳答案呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-10-17 20:14:07 | 显示全部楼层
学习了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-19 08:34

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表