鱼C论坛

 找回密码
 立即注册
查看: 490|回复: 5

[已解决][课后作业] 第029讲 第4题 其他功能都能实习,最后文件内字符的替换不成功

[复制链接]
发表于 2018-12-30 21:41:45 | 显示全部楼层 |阅读模式

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

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

x
#代码如下:
#输入用户提示
file_name = input("请输入文件名:")
old_word = input("请输入需要替换的单词或字符:")
new_word = input("请输入新的单词或字符:")
#打开文件
f = open(file_name,"r+")
#输出确认提示
old_total = 0
for eachline in f:
        for eachword in eachline:
                if eachword == old_word:
                        old_total += 1

print("文件%s中共有%d个[%s]" %(file_name,old_total,old_word))
print("您确定把所有的[%s]替换为[%s]吗" %(old_word,new_word))
nextstep = input("[YES/NO]:")
#遍历文件进行替换
if nextstep == 'YES':
        for eachline in f:
                for eachword in eachline:
                        if eachword == old_word:
                                eachline = eachline.replace(old_word, new_word)
#关闭文件
f.close()
最佳答案
2018-12-30 22:51:25
  1. file_name = input("请输入文件名:")
  2. old_word = input("请输入需要替换的单词或字符:").strip()
  3. new_word = input("请输入新的单词或字符:").strip()
  4. #打开文件
  5. f = open(file_name,"r+")
  6. #输出确认提示
  7. old_total = 0
  8. for eachline in f:
  9.         for eachword in eachline.split():
  10.                 if eachword == old_word:
  11.                         old_total += 1

  12. print("文件%s中共有%d个[%s]" %(file_name,old_total,old_word))
  13. print("您确定把所有的[%s]替换为[%s]吗" %(old_word,new_word))
  14. nextstep = input("[YES/NO]:")
  15. #遍历文件进行替换
  16. if nextstep == 'YES':
  17.         content=''
  18.         f.seek(0,0)
  19.         for eachline in f:
  20.              eachline=eachline.replace(old_word, new_word)
  21.              content+=eachline
  22. f.seek(0,0)
  23. f.write(content)
  24. #关闭文件
  25. f.close()
复制代码

在不做其他大的改变的情况下,你必须做几个改动,代码才能正常运行。
1、你用'r+'打开,你要重新读写内容,必须用f.seek(0,0)回到文件起始位置。
2、你的for语句不熟,不知道你的逻辑是什么。
3、你替换完了后,还必须回写。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-12-30 22:43:48 | 显示全部楼层
我的版本
  1. file_name = input('请输入文件名:')
  2. old = input('请输入需要替换的单词或字符:')
  3. new = input('请输入新的单词或字符:')
  4. f = open(file_name)
  5. text_old = f.read()
  6. f.close()
  7. count = text_old.count(old)

  8. def ensure(file_name,old,new,count):
  9.     print('\n')
  10.     if count:
  11.         print('文件{0}中共有{1}个【{2}】\n\
  12. 你确定要把所有的【{3}】替换为【{4}】吗?'.format(file_name,count,old,old,new))
  13.         order = input('【YES/NO】:')
  14.         if order in ('YES','yes'):
  15.             return 1
  16.         else:
  17.             return 0
  18.     else:
  19.         print('文中没有【{0}】'.format(old))
  20.         return 0

  21. def change(file_name,text_old,old,new):
  22.     text_new = text_old.replace(old,new)
  23.     file = open(file_name,'w')
  24.     file.write(text_new)
  25.     file.close()

  26. if ensure(file_name,old,new,count):
  27.     change(file_name,text_old,old,new)



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

使用道具 举报

发表于 2018-12-30 22:51:25 | 显示全部楼层    本楼为最佳答案   
  1. file_name = input("请输入文件名:")
  2. old_word = input("请输入需要替换的单词或字符:").strip()
  3. new_word = input("请输入新的单词或字符:").strip()
  4. #打开文件
  5. f = open(file_name,"r+")
  6. #输出确认提示
  7. old_total = 0
  8. for eachline in f:
  9.         for eachword in eachline.split():
  10.                 if eachword == old_word:
  11.                         old_total += 1

  12. print("文件%s中共有%d个[%s]" %(file_name,old_total,old_word))
  13. print("您确定把所有的[%s]替换为[%s]吗" %(old_word,new_word))
  14. nextstep = input("[YES/NO]:")
  15. #遍历文件进行替换
  16. if nextstep == 'YES':
  17.         content=''
  18.         f.seek(0,0)
  19.         for eachline in f:
  20.              eachline=eachline.replace(old_word, new_word)
  21.              content+=eachline
  22. f.seek(0,0)
  23. f.write(content)
  24. #关闭文件
  25. f.close()
复制代码

在不做其他大的改变的情况下,你必须做几个改动,代码才能正常运行。
1、你用'r+'打开,你要重新读写内容,必须用f.seek(0,0)回到文件起始位置。
2、你的for语句不熟,不知道你的逻辑是什么。
3、你替换完了后,还必须回写。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-12-30 22:53:02 | 显示全部楼层
首先,用for eachword in eachline来实现计数和替换我觉得不可行。因为迭代eachline每次得到的是单个字符,而当用户输入的是多个字符时,程序就会有毛病,所以你说其余一切正常,恐怕是没有试过输入多个字符。
其次,直接在文件迭代读取中给eachline赋值肯定是没有效果的,你只是给eachline这个变量赋了值,而文件本身没有改变,只有当你将新字符串写入文件时才有效果。我直接把整个文件读成字符串,操作后再重新写入,会方便一点。
By the way,我也是小白一枚,望高手见教
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-12-31 09:36:41 | 显示全部楼层
喜欢吃菠菜 发表于 2018-12-30 22:51
在不做其他大的改变的情况下,你必须做几个改动,代码才能正常运行。
1、你用'r+'打开,你要重新读写内 ...

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

使用道具 举报

 楼主| 发表于 2018-12-31 09:37:51 | 显示全部楼层
19304270021304 发表于 2018-12-30 22:53
首先,用for eachword in eachline来实现计数和替换我觉得不可行。因为迭代eachline每次得到的是单个字符, ...

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-7 20:06

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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