鱼C论坛

 找回密码
 立即注册
查看: 1621|回复: 16

[已解决]关于文件保存

[复制链接]
发表于 2021-6-11 13:00:48 | 显示全部楼层 |阅读模式

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

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

x
大佬们,这个代码文件打开了,却没有关闭,为什么保存了啊?
最佳答案
2021-6-11 22:29:06
Twilight6 发表于 2021-6-11 22:22
我知道了,我刚刚查不到类似资料,所以自己测试了

你试试执行这个代码:


在这之后又测试了两个实例,和上面结果相同

则得出结论:局部变量被回收触发缓冲机制刷新从而导致用户未关闭文件而成功将数据写入文件对象中去

实例1,未成功写入:

  1. def Test():
  2.     file.write('测试')
  3.     file.write('测试')
  4.     file.write('测试')

  5. # 全局变量 file
  6. file = open('Test.txt', 'w')
  7. print('调用Test函数')
  8. Test()
  9. print('程序关闭')
复制代码


实例2,未成功写入数据:
  1. def Test():
  2.     global file
  3.     file = open('Test.txt', 'w')
  4.     file.write('测试')
  5.     file.write('测试')
  6.     file.write('测试')

  7. # 全局变量 file
  8. file = 0
  9. print('调用Test函数')
  10. Test()
  11. print('程序关闭')
复制代码

文件保存(可).PNG
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-6-11 13:01:30 | 显示全部楼层
a=open('record (3).txt')
x=1
def han():
    global x
    x=str(x)
    q=open('boy_'+x+'.txt','w')
    w=open('girl_'+x+'.txt','w')
    for i in a:
        if '小甲鱼:' in i:
            (wu,k)=i.split(':',1)
            q.write(k)
        elif '小客服:' in i:
            (wu,k)=i.split(':',1)
            w.write(k)
        elif "==========" in i:
            x=int(x)
            x=x+1
            han()
han()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-6-11 13:36:40 | 显示全部楼层

成功执行了 open 函数且模式为 'W' 写入时,就相当于成功创建文件了

而你文件中内容是否正常写入,就要看你是否正常关闭文件了

我们在执行程序过程中,对文件对象进行写入数据操作时,这些写入的数据都是记录在缓冲区中的

正常关闭文件就会正常的将缓冲区内容写入,而不正常关闭文件(比如你为 close 直接关闭程序)会导致缓冲区的内容无法写入,导致数据丢失

你也可以手动刷新写入缓冲区中的数据,即调用文件对象方法 flush

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

使用道具 举报

 楼主| 发表于 2021-6-11 21:03:57 | 显示全部楼层
Twilight6 发表于 2021-6-11 13:36
成功执行了 open 函数且模式为 'W' 写入时,就相当于成功创建文件了

而你文件中内容是否正常写入,就 ...

可是大佬,我不会用flush啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-6-11 21:06:52 | 显示全部楼层
正天圣人 发表于 2021-6-11 21:03
可是大佬,我不会用flush啊


就你退出程序前调用一下就行了呀

比如对于 f 这个文件对象,调用 f.flush() 就行

最后也可以直接用 with 来打开文件, with 会自动关闭文件对象的

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

使用道具 举报

 楼主| 发表于 2021-6-11 21:13:13 | 显示全部楼层
Twilight6 发表于 2021-6-11 21:06
就你退出程序前调用一下就行了呀

比如对于 f 这个文件对象,调用 f.flush() 就行

大佬,什么都没有,是什么意思呢?
flush.PNG
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-6-11 21:19:52 | 显示全部楼层
正天圣人 发表于 2021-6-11 21:13
大佬,什么都没有,是什么意思呢?



认真看下 3L 的评论,有说明 flush 的功能

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

使用道具 举报

 楼主| 发表于 2021-6-11 21:27:37 | 显示全部楼层
Twilight6 发表于 2021-6-11 21:19
认真看下 3L 的评论,有说明 flush 的功能

大佬,我把那个flush调到上面来了,为什么write之后,缓冲区的东西就直接没有了?
flush2.PNG
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-6-11 21:29:37 | 显示全部楼层
正天圣人 发表于 2021-6-11 21:27
大佬,我把那个flush调到上面来了,为什么write之后,缓冲区的东西就直接没有了?




是将此时缓冲区中的数据写入到文件中去

另外我们也看不出缓冲区有还是没有数据

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

使用道具 举报

 楼主| 发表于 2021-6-11 21:38:02 | 显示全部楼层
Twilight6 发表于 2021-6-11 21:29
是将此时缓冲区中的数据写入到文件中去

另外我们也看不出缓冲区有还是没有数据

大佬,我要知道文件什么时候关闭的,可是flush不是清缓冲区的吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-6-11 21:42:05 | 显示全部楼层
正天圣人 发表于 2021-6-11 21:38
大佬,我要知道文件什么时候关闭的,可是flush不是清缓冲区的吗?



那下次问题描述清晰些:

大佬们,这个代码文件打开了,却没有关闭,为什么保存了啊?


Python 内存回收机制回收了,因为你终止程序时,系统内存回收,文件自然就关闭了,因为你没有正常关闭文件,所以在缓冲区的数据不会写入文件中去

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

使用道具 举报

 楼主| 发表于 2021-6-11 21:48:24 | 显示全部楼层
Twilight6 发表于 2021-6-11 21:42
那下次问题描述清晰些:

可是大佬,已经写入文件了啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-6-11 22:11:06 | 显示全部楼层
正天圣人 发表于 2021-6-11 21:48
可是大佬,已经写入文件了啊



刚刚测试了下,确实成功写入了,我去查查资料

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

使用道具 举报

发表于 2021-6-11 22:22:11 | 显示全部楼层
正天圣人 发表于 2021-6-11 21:48
可是大佬,已经写入文件了啊



我知道了,我刚刚查不到类似资料,所以自己测试了

你试试执行这个代码:

  1. file = open('Test.txt', 'w')
  2. file.write('测试\n')
  3. file.write('测试\n')
  4. file.write('测试\n')
  5. print("程序结束")
复制代码


会发现文件成功创建但是未写入,因为缓冲区的内容没有在程序停止前写入文件中

你再试试这个代码:
  1. def Test():
  2.     file = open('Test.txt', 'w')
  3.     file.write('测试\n')
  4.     file.write('测试\n')
  5.     file.write('测试\n')

  6. print('调用Test函数')
  7. Test()
  8. print('程序关闭')
复制代码


发现未关闭文件却成功将数据写入文件,是因为此时的 file 属于函数内部的变量,即局部变量

调用函数结束时,局部变量会消失,被内存回收,同时因为文件对象被提前回收,所以此时会将缓冲区的内容写入文件对象

以上是我个人观点,可能有些差错,但是我认为应该是没什么问题的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-6-11 22:29:06 | 显示全部楼层    本楼为最佳答案   
Twilight6 发表于 2021-6-11 22:22
我知道了,我刚刚查不到类似资料,所以自己测试了

你试试执行这个代码:


在这之后又测试了两个实例,和上面结果相同

则得出结论:局部变量被回收触发缓冲机制刷新从而导致用户未关闭文件而成功将数据写入文件对象中去

实例1,未成功写入:

  1. def Test():
  2.     file.write('测试')
  3.     file.write('测试')
  4.     file.write('测试')

  5. # 全局变量 file
  6. file = open('Test.txt', 'w')
  7. print('调用Test函数')
  8. Test()
  9. print('程序关闭')
复制代码


实例2,未成功写入数据:
  1. def Test():
  2.     global file
  3.     file = open('Test.txt', 'w')
  4.     file.write('测试')
  5.     file.write('测试')
  6.     file.write('测试')

  7. # 全局变量 file
  8. file = 0
  9. print('调用Test函数')
  10. Test()
  11. print('程序关闭')
复制代码

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

使用道具 举报

 楼主| 发表于 2021-6-11 22:37:53 | 显示全部楼层
Twilight6 发表于 2021-6-11 22:29
在这之后又测试了两个实例,和上面结果相同

则得出结论:局部变量被回收触发缓冲机制刷新从而导致用 ...

好的,谢谢大佬!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-6-11 22:41:05 | 显示全部楼层



客气了,你也让我学到了

还是太多细节,单纯理论容易忽视特殊情况

果然,实践才是检验真理的唯一方法

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-26 11:34

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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