鱼C论坛

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

[已解决]请教29课作业为何清空文件内容无效

[复制链接]
发表于 2017-9-13 19:20:20 | 显示全部楼层 |阅读模式

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

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

x
要求用“希望”替换所有的“愿”,我考虑读取文件后,将文件内容清空,再重新写入,成功完成替换,可是结果总是有原文件内容,代码与结果如下:
  1. def file(name,old,new):
  2.     f = open(name,'r+')
  3.     str = f.read()
  4.     n = str.count(old)
  5.     print('一共有%d个%s' % (n,old))
  6.     print('确定把所有的%s替换成%s吗【YES/NO】' % (old,new))
  7.     decide = input('请选择【YES/NO】:')
  8.     if decide == 'YES':
  9.         print(str.replace(old,new))
  10.         f.truncate()  #清空文件内容
  11.         f.write(str.replace(old,new))
  12.         f.close()
  13.         print('替换成功!')
  14.     else:
  15.         print('未替换!')
  16.         f.close()
  17.    
  18. name = input('请输入文件名:')
  19. old = input('请输入需要替换的字符:')
  20. new = input('请输入新的字符:')

  21. file(name,old,new)
复制代码

  1. 作者:海子 《面朝大海, 春暖花开》
  2. 从明天起, 做一个幸福的人
  3. 喂马, 劈柴, 周游世界
  4. 从明天起, 关心粮食和蔬菜
  5. 我有一所房子, 面朝大海, 春暖花开  
  6. 从明天起, 和每一个亲人通信
  7. 告诉他们我的幸福
  8. 那幸福的闪电告诉我的
  9. 我将告诉每一个人
  10. 给每一条河每一座山取一个温暖的名字
  11. 陌生人, 我也为你祝福
  12. 愿你有一个灿烂的前程
  13. 愿你有情人终成眷属
  14. 愿你在尘世获得幸福
  15. 而我只愿面朝大海, 春暖花开作者:海子 《面朝大海, 春暖花开》

  16. 作者:海子 《面朝大海, 春暖花开》
  17. 从明天起, 做一个幸福的人
  18. 喂马, 劈柴, 周游世界
  19. 从明天起, 关心粮食和蔬菜
  20. 我有一所房子, 面朝大海, 春暖花开  
  21. 从明天起, 和每一个亲人通信
  22. 告诉他们我的幸福
  23. 那幸福的闪电告诉我的
  24. 我将告诉每一个人
  25. 给每一条河每一座山取一个温暖的名字
  26. 陌生人, 我也为你祝福
  27. 希望你有一个灿烂的前程
  28. 希望你有情人终成眷属
  29. 希望你在尘世获得幸福
  30. 而我只希望面朝大海, 春暖花开作者:海子 《面朝大海, 春暖花开》
复制代码

最佳答案
2017-9-13 19:30:40
  1. def file(name,old,new):
  2.     f = open(name,'r+')
  3.     str = f.read()
  4.     n = str.count(old)
  5.     print('一共有%d个%s' % (n,old))
  6.     print('确定把所有的%s替换成%s吗【YES/NO】' % (old,new))
  7.     decide = input('请选择【YES/NO】:')
  8.     if decide == 'YES':
  9.         print(str.replace(old,new))
  10.         f.seek(2) #把文件指针移到未尾
  11.         f.truncate()  #清空文件内容(截取文件到size个字节,默认是截取到文件指针当前位置)
  12.         f.write(str.replace(old,new))
  13.         f.close()
  14.         print('替换成功!')
  15.     else:
  16.         print('未替换!')
  17.         f.close()
  18.    
  19. name = input('请输入文件名:')
  20. old = input('请输入需要替换的字符:')
  21. new = input('请输入新的字符:')

  22. file(name,old,new)
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2017-9-13 19:30:40 | 显示全部楼层    本楼为最佳答案   
  1. def file(name,old,new):
  2.     f = open(name,'r+')
  3.     str = f.read()
  4.     n = str.count(old)
  5.     print('一共有%d个%s' % (n,old))
  6.     print('确定把所有的%s替换成%s吗【YES/NO】' % (old,new))
  7.     decide = input('请选择【YES/NO】:')
  8.     if decide == 'YES':
  9.         print(str.replace(old,new))
  10.         f.seek(2) #把文件指针移到未尾
  11.         f.truncate()  #清空文件内容(截取文件到size个字节,默认是截取到文件指针当前位置)
  12.         f.write(str.replace(old,new))
  13.         f.close()
  14.         print('替换成功!')
  15.     else:
  16.         print('未替换!')
  17.         f.close()
  18.    
  19. name = input('请输入文件名:')
  20. old = input('请输入需要替换的字符:')
  21. new = input('请输入新的字符:')

  22. file(name,old,new)
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-9-13 20:30:01 | 显示全部楼层

ba21版主好,我再次确认了一下,你的回帖似乎有些小问题:
truncate() 方法用于截断文件,如果指定了可选参数 size,则表示截断文件为 size 个字符。 如果没有指定 size,则从当前位置起截断;截断之后 size 后面的所有字符被删除。
f.seek(2)会“作”这个字会被截出来,应该采用f.seek(0)到起始位置。
还是非常感谢你的回帖,多谢帮助!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-9-13 20:55:31 | 显示全部楼层
  1. def file(name,old,new):
  2.     f = open(name,'r+')
  3.     str = f.read()
  4.     n = str.count(old)
  5.     print('一共有%d个%s' % (n,old))
  6.     print('确定把所有的%s替换成%s吗【YES/NO】' % (old,new))
  7.     decide = input('请选择【YES/NO】:')
  8.     if decide == 'YES':
  9.         print(str.replace(old,new))
  10.         f.close()
  11.         with open(name,'w') as f:   
  12.             f.write(str.replace(old,new))        
  13.         print('替换成功!')
  14.     else:
  15.         print('未替换!')
  16.         f.close()
  17.    
  18. name = input('请输入文件名:')
  19. old = input('请输入需要替换的字符:')
  20. new = input('请输入新的字符:')

  21. file(name,old,new)
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-9-13 21:12:59 | 显示全部楼层
sige 发表于 2017-9-13 20:30
ba21版主好,我再次确认了一下,你的回帖似乎有些小问题:
truncate() 方法用于截断文件,如果指定了可 ...

默认是截取到文件指针当前位置

这有什么不妥吗? 把指针指到未,然后截断,内容没有了,重新写入新内容

实例说话,你自己说解决你的问题没有:
2017-09-13_211122.png


2017-09-13_211144.png
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-9-14 09:01:32 | 显示全部楼层
ba21 发表于 2017-9-13 21:12
默认是截取到文件指针当前位置

这有什么不妥吗? 把指针指到未,然后截断,内容没有了,重新写入新内 ...

好的,谢谢!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-9-14 09:02:48 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-9-14 09:46:55 | 显示全部楼层

满意请设个最佳
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-9-14 17:40:37 | 显示全部楼层
ba21 发表于 2017-9-14 09:46
满意请设个最佳

ok
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-3-2 09:12

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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