鱼C论坛

 找回密码
 立即注册
查看: 1125|回复: 7

[已解决]请教一个文件操作的奇怪的问题

[复制链接]
发表于 2020-5-14 22:57:33 | 显示全部楼层 |阅读模式

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

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

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

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

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

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

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

  11. temp = []
  12. i = 0
  13. for each in list_temp:
  14.     if each[0:3] == "===":
  15.         n = list_temp.index(each)
  16.         temp.append (list_temp[i:n])            
  17.         list_temp.remove(each)
  18.         i = n
  19. temp.append (list_temp[i:])

  20. j = 0
  21. while j < len(temp):
  22.     for each in temp[j]:
  23.         if each[0:3] == "小甲鱼":
  24.             a=open("C:/Users/Zhao Yuansong/OneDrive/python练习/029/record_boy"+str(j)+".txt","a")
  25.             a.writelines(each[4:])
  26.         elif each[0:3] == "小客服":
  27.             a=open("C:/Users/Zhao Yuansong/OneDrive/python练习/029/record_girl"+str(j)+".txt","a")
  28.             a.writelines(each[4:])
  29.     j += 1
  30.    
  31.               
复制代码

原文件最后一段如下:
222.PNG

用'a'打开:
111.PNG

用‘w’打开
33.PNG
最佳答案
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个文件有最后一行,而最后一个文件是空的才对,难道是楼主还做了其他的操作关闭了文件所以才看到那个“滚”字?这个需要楼主再测试看看怎么回事了。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-5-14 23:02:48 | 显示全部楼层
因为你把打开文件写在了循环里面,'w' 是写入操作,当文件已经存在他会重新创建一个新文件来覆盖已经存在的文件,因为你的循环 导致你每次都只写入一次,然后被下次循环的写入给覆盖
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

是的
但是我的疑问是为什么它们最后一行不一样
用'a'打开少一行
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-14 23:15:48 | 显示全部楼层
5695585 发表于 2020-5-14 23:06
是的
但是我的疑问是为什么它们最后一行不一样
用'a'打开少一行
  1. f = open("C:/Users/Zhao Yuansong/OneDrive/python练习/029/record.txt",encoding='utf-8')
  2. list_temp = f.readlines()

  3. temp = []
  4. i = 0
  5. for each in list_temp:
  6.     if each[0:3] == "===":
  7.         n = list_temp.index(each)
  8.         temp.append(list_temp[i:n])
  9.         list_temp.remove(each)
  10.         i = n
  11. temp.append(list_temp[i:])
  12. j = 0
  13. while j < len(temp):
  14.     for each in temp[j]:
  15.         if each[0:3] == "小甲鱼":
  16.             a1 = open("C:/Users/Zhao Yuansong/OneDrive/python练习/029/record_boy" + str(j) + ".txt","a",encoding='utf-8')
  17.             a1.writelines(each[4:])
  18.         elif each[0:3] == "小客服":
  19.             a2 = open("C:/Users/Zhao Yuansong/OneDrive/python练习/029/record_girl" + str(j) + ".txt", "a",encoding='utf-8')
  20.             a2.writelines(each[4:])
  21.     j += 1
复制代码

我运行了你的代码,完全正常,没有你说的滚字没了,我这边只加了编码,其他都没动
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-15 00:12:26 | 显示全部楼层
flush?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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个文件有最后一行,而最后一个文件是空的才对,难道是楼主还做了其他的操作关闭了文件所以才看到那个“滚”字?这个需要楼主再测试看看怎么回事了。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 2 反对 0

使用道具 举报

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

对,楼上说的 很有道理,支持楼上
你IDLE打错了嘿嘿
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-15 08:51:20 | 显示全部楼层
6楼说的对!!
应该就是你没有关闭文件导致的。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-19 07:02

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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