5695585 发表于 2020-5-14 22:57:33

请教一个文件操作的奇怪的问题

本帖最后由 5695585 于 2020-5-14 23:09 编辑

在第29讲里面课堂练习
我按小甲鱼的要求先暂停视频然后试着去做它的课堂题
发现

打开方式是"a",保存的文件缺最后一行
但是如果打开方式是"w",保存的文件虽然不断被刷新导致只有最后一行,但是真的有最后一行

我的问题是:为什么用a打开比w打开,少写入了最后一行?

"""
这个程序作用是把record.txt打开
然后按====这个分隔符号把文件截开
截开的部分中
对话“小甲鱼”说的存成_boy
对话“小客服”说的存成_girl
并在文件中删除“小甲鱼:”和“小客服:”
"""
f=open("C:/Users/Zhao Yuansong/OneDrive/python练习/029/record.txt")
list_temp = f.readlines()

temp = []
i = 0
for each in list_temp:
    if each == "===":
      n = list_temp.index(each)
      temp.append (list_temp)            
      list_temp.remove(each)
      i = n
temp.append (list_temp)

j = 0
while j < len(temp):
    for each in temp:
      if each == "小甲鱼":
            a=open("C:/Users/Zhao Yuansong/OneDrive/python练习/029/record_boy"+str(j)+".txt","a")
            a.writelines(each)
      elif each == "小客服":
            a=open("C:/Users/Zhao Yuansong/OneDrive/python练习/029/record_girl"+str(j)+".txt","a")
            a.writelines(each)
    j += 1
   
            

原文件最后一段如下:


用'a'打开:


用‘w’打开

Twilight6 发表于 2020-5-14 23:02:48

因为你把打开文件写在了循环里面,'w' 是写入操作,当文件已经存在他会重新创建一个新文件来覆盖已经存在的文件,因为你的循环 导致你每次都只写入一次,然后被下次循环的写入给覆盖

5695585 发表于 2020-5-14 23:06:06

Twilight6 发表于 2020-5-14 23:02
因为你把打开文件写在了循环里面,'w' 是写入操作,当文件已经存在他会重新创建一个新文件来覆盖已经存在的 ...

是的
但是我的疑问是为什么它们最后一行不一样
用'a'打开少一行

Twilight6 发表于 2020-5-14 23:15:48

5695585 发表于 2020-5-14 23:06
是的
但是我的疑问是为什么它们最后一行不一样
用'a'打开少一行

f = open("C:/Users/Zhao Yuansong/OneDrive/python练习/029/record.txt",encoding='utf-8')
list_temp = f.readlines()

temp = []
i = 0
for each in list_temp:
    if each == "===":
      n = list_temp.index(each)
      temp.append(list_temp)
      list_temp.remove(each)
      i = n
temp.append(list_temp)
j = 0
while j < len(temp):
    for each in temp:
      if each == "小甲鱼":
            a1 = open("C:/Users/Zhao Yuansong/OneDrive/python练习/029/record_boy" + str(j) + ".txt","a",encoding='utf-8')
            a1.writelines(each)
      elif each == "小客服":
            a2 = open("C:/Users/Zhao Yuansong/OneDrive/python练习/029/record_girl" + str(j) + ".txt", "a",encoding='utf-8')
            a2.writelines(each)
    j += 1
我运行了你的代码,完全正常,没有你说的滚字没了,我这边只加了编码,其他都没动

赚小钱 发表于 2020-5-15 00:12:26

flush?

txxcat 发表于 2020-5-15 01:08:14

    我猜想楼主用的IDE是idel?而楼上改代码运行用的是pycharm?因为毕竟这两个IDE是用的最多的两款了。
    楼主的代码里没有close()语句,这是缺失最后一行的关键。打开文件写入数据后,实际上内容并没有立即被写入到文件中去,而是在内存中,需要关闭才会写入。楼主的代码虽然没有close(),但每次循环会以同一个句柄a来打开文件,系统会关闭一次然后再打开,所以之前没有执行的close()被新的open强制执行了一次,这样内容就写进去了,但是到了最后一句,再也没有新的open来强制关闭文件,所以此时直接打开就没有最后一行了,此时在交互界面执行一次a.close(),再打开就发现最后一行被写进去了。
    楼上运行的代码大同小异,为什么没有问题?关键在于pycharm是模拟一个完整的python环境来运行代码,代码运行完毕后会退出python环境,而python在退出时会自动关闭所有打开的文件,所以最后一行也被写进去了。这点可以在命令行里运行:python 程序名.py,来验证。
    如果以上推测正确,那么楼主以w方式运行,立即打开文件应该是5个文件有最后一行,而最后一个文件是空的才对,难道是楼主还做了其他的操作关闭了文件所以才看到那个“滚”字?这个需要楼主再测试看看怎么回事了。

Twilight6 发表于 2020-5-15 08:10:11

txxcat 发表于 2020-5-15 01:08
我猜想楼主用的IDE是idel?而楼上改代码运行用的是pycharm?因为毕竟这两个IDE是用的最多的两款了。
...

对,楼上说的 很有道理,支持楼上
你IDLE打错了嘿嘿

sunrise085 发表于 2020-5-15 08:51:20

6楼说的对!!
应该就是你没有关闭文件导致的。
页: [1]
查看完整版本: 请教一个文件操作的奇怪的问题