鱼C论坛

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

[已解决]with open('data.txt','w')as f:自动调用f.close问题

[复制链接]
发表于 2021-9-11 21:31:15 | 显示全部楼层 |阅读模式

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

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

x

try:
    with open('data.txt','w')as f:
        for each in f:
            print(each)

except OSError as reason:
    print('出错:'+str(reason))

P35讲最后一个例子不懂 ,不懂的点在
  with open('data.txt','w')as f:  小甲鱼说with会关注open('data.txt','w') 什么时候不用,不用的时候会自动调用f.close()
请问我as后面gender是f,怎么会自动调用f.close呢?我的逻辑是应该写成 with open('data.txt','w')as f.close:
....
请大神帮忙解答
最佳答案
2021-9-12 10:22:44
本帖最后由 阿奇_o 于 2021-9-12 10:24 编辑
为什么as 后面跟的是f,f我并没有定义....

定义一个变量,有多种方式,不只是最常见的 a = 1,   f = open(...)  ,   
这里的 with 语句,with open(...) as f 这样也是一种变量声明(定义),
声明的本质是把一个任意合法的变量名(标识符)关联指向一个对象(这里是open()返回的文件对象),
即 变量名 你叫 张三、李四都行,只要你正确且合法地关联到一个对象上,它都是可以的。

类似的还有 import语句, import pandas as pd 这种也是,变量名pd 关联指向了 pandas 这个模块对象。

至于为什么会自己调用 f.close() ,   这个没什么好解释的了,因为它就是为了这个而存在的,方便,
不用手动写close(),这是with语句的特性,不用担心忘了写close() 而导致资源占用等问题。

若还想深究下去,那你就去了解了解:什么叫"上下文管理"?
—— 文件对象 的类 定义了__enter__ , __exit__  ,于是它就是一种"上下文管理"的实现,于是它就可以用 with 语句。

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-9-11 21:39:56 | 显示全部楼层
本帖最后由 suchocolate 于 2021-9-11 21:45 编辑
with open('data.txt','r') as f:
读取得用r。with方式的自动就是不需要主动写close,不然跟写f=open('xxx')就没区别了。
文件操作:https://www.runoob.com/python3/python3-file-methods.html
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-9-11 21:46:15 | 显示全部楼层


你好,可能题意理解错了。这节课讲的是错误代码,with open('data.txt','w') as f: 用的是打开文件并写入,然后逐行读取,输出   for each in f:  print(each)  ,故意空文件,读取报错, 我纠结的是为什么as 后面跟的是f,f我并没有定义,为什么会在不适用的时候默认是f.close()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-9-11 21:52:57 | 显示全部楼层
peichao 发表于 2021-9-11 21:46
你好,可能题意理解错了。这节课讲的是错误代码,with open('data.txt','w') as f: 用的是打开文件并写 ...

f是文件的句柄,with open('data.txt','w') as f:的作用相对应
f = with open('data.txt','w') ,只是多了自动关闭文件的功能。
我改写了程序,可能看的更清楚些
try:
    with open('data.txt','w')as f:
        f.write('123\n')
        a = 3 / 0
        f.write('456\n')

except ZeroDivisionError as reason:
    print('出错:'+str(reason))
运行后,打开文本文件会有123数据,说明用with可以在出错时仍然会替你关闭文件。
对比一下
f = open('data2.txt','w')
f.write('123\n')
a = 3 / 0
f.write('456\n')
f.close()
data2文件是空的,说明没有关闭文件,所以123也没有写入
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-9-12 09:29:13 | 显示全部楼层
为什么是 f?
因为 f 只是一个代号而已,你也改成别的,例如 s,file 等等,这都无所谓的,只是为了把这个文件作为缩写而已。方便你在下边的代码中使用。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-9-12 10:22:44 | 显示全部楼层    本楼为最佳答案   
本帖最后由 阿奇_o 于 2021-9-12 10:24 编辑
为什么as 后面跟的是f,f我并没有定义....

定义一个变量,有多种方式,不只是最常见的 a = 1,   f = open(...)  ,   
这里的 with 语句,with open(...) as f 这样也是一种变量声明(定义),
声明的本质是把一个任意合法的变量名(标识符)关联指向一个对象(这里是open()返回的文件对象),
即 变量名 你叫 张三、李四都行,只要你正确且合法地关联到一个对象上,它都是可以的。

类似的还有 import语句, import pandas as pd 这种也是,变量名pd 关联指向了 pandas 这个模块对象。

至于为什么会自己调用 f.close() ,   这个没什么好解释的了,因为它就是为了这个而存在的,方便,
不用手动写close(),这是with语句的特性,不用担心忘了写close() 而导致资源占用等问题。

若还想深究下去,那你就去了解了解:什么叫"上下文管理"?
—— 文件对象 的类 定义了__enter__ , __exit__  ,于是它就是一种"上下文管理"的实现,于是它就可以用 with 语句。

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

使用道具 举报

 楼主| 发表于 2021-9-12 21:28:14 | 显示全部楼层
冬雪雪冬 发表于 2021-9-11 21:52
f是文件的句柄,with open('data.txt','w') as f:的作用相对应
f = with open('data.txt','w') ,只是多 ...

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

使用道具 举报

 楼主| 发表于 2021-9-12 21:28:51 | 显示全部楼层
江湖散人 发表于 2021-9-12 09:29
为什么是 f?
因为 f 只是一个代号而已,你也改成别的,例如 s,file 等等,这都无所谓的,只是为了把这个 ...

第一次发帖,好多人都给出了 可以理解的答案,论坛大爱呀。谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-9-13 08:24:32 | 显示全部楼层
peichao 发表于 2021-9-12 21:28
第一次发帖,好多人都给出了 可以理解的答案,论坛大爱呀。谢谢

没事,一起学习么!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-13 10:14

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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