正天圣人 发表于 2021-6-11 13:00:48

关于文件保存

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

正天圣人 发表于 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()

Twilight6 发表于 2021-6-11 13:36:40


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

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

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

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

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

正天圣人 发表于 2021-6-11 21:03:57

Twilight6 发表于 2021-6-11 13:36
成功执行了 open 函数且模式为 'W' 写入时,就相当于成功创建文件了

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

可是大佬,我不会用flush啊

Twilight6 发表于 2021-6-11 21:06:52

正天圣人 发表于 2021-6-11 21:03
可是大佬,我不会用flush啊


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

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

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

正天圣人 发表于 2021-6-11 21:13:13

Twilight6 发表于 2021-6-11 21:06
就你退出程序前调用一下就行了呀

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


大佬,什么都没有,是什么意思呢?

Twilight6 发表于 2021-6-11 21:19:52

正天圣人 发表于 2021-6-11 21:13
大佬,什么都没有,是什么意思呢?



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

正天圣人 发表于 2021-6-11 21:27:37

Twilight6 发表于 2021-6-11 21:19
认真看下 3L 的评论,有说明 flush 的功能

大佬,我把那个flush调到上面来了,为什么write之后,缓冲区的东西就直接没有了?

Twilight6 发表于 2021-6-11 21:29:37

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



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

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

正天圣人 发表于 2021-6-11 21:38:02

Twilight6 发表于 2021-6-11 21:29
是将此时缓冲区中的数据写入到文件中去

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

大佬,我要知道文件什么时候关闭的,可是flush不是清缓冲区的吗?

Twilight6 发表于 2021-6-11 21:42:05

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


那下次问题描述清晰些:

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

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

正天圣人 发表于 2021-6-11 21:48:24

Twilight6 发表于 2021-6-11 21:42
那下次问题描述清晰些:




可是大佬,已经写入文件了啊

Twilight6 发表于 2021-6-11 22:11:06

正天圣人 发表于 2021-6-11 21:48
可是大佬,已经写入文件了啊



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

Twilight6 发表于 2021-6-11 22:22:11

正天圣人 发表于 2021-6-11 21:48
可是大佬,已经写入文件了啊


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

你试试执行这个代码:

file = open('Test.txt', 'w')
file.write('测试\n')
file.write('测试\n')
file.write('测试\n')
print("程序结束")

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

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

print('调用Test函数')
Test()
print('程序关闭')

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

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

以上是我个人观点,可能有些差错,但是我认为应该是没什么问题的

Twilight6 发表于 2021-6-11 22:29:06

Twilight6 发表于 2021-6-11 22:22
我知道了,我刚刚查不到类似资料,所以自己测试了

你试试执行这个代码:



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

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

实例1,未成功写入:

def Test():
    file.write('测试')
    file.write('测试')
    file.write('测试')

# 全局变量 file
file = open('Test.txt', 'w')
print('调用Test函数')
Test()
print('程序关闭')

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

# 全局变量 file
file = 0
print('调用Test函数')
Test()
print('程序关闭')

正天圣人 发表于 2021-6-11 22:37:53

Twilight6 发表于 2021-6-11 22:29
在这之后又测试了两个实例,和上面结果相同

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

好的,谢谢大佬!

Twilight6 发表于 2021-6-11 22:41:05

正天圣人 发表于 2021-6-11 22:37
好的,谢谢大佬!


客气了,你也让我学到了

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

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

页: [1]
查看完整版本: 关于文件保存