鱼C论坛

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

[已解决]29,一个任务课后题最后一题,求助

[复制链接]
发表于 2018-2-1 01:13:14 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 jcx1117 于 2018-2-1 01:17 编辑

根据题目要求自己写的代码,打开文件“something.txt”,文件内容:
“《面朝大海,春暖花开》 作者:海子
从明天起,做一个幸福的人
喂马、劈柴,周游世界
从明天起,关心粮食和蔬菜
我有一所房子,面朝大海,春暖花开

从明天起,和每一个亲人通信
告诉他们我的幸福
那幸福的闪电告诉我的
我将告诉每一个人

给每一条河每一座山取一个温暖的名字
陌生人,我也为你祝福
愿你有一个灿烂的前程
愿你有情人终成眷属
愿你在尘世获得幸福
我只愿面朝大海,春暖花开”

要求将文件中“愿”替换成“希望”

结果执行结果:
“《面朝大海,春暖花开》 作者:海子
从明天起,做一个幸福的人
喂马、劈柴,周游世界
从明天起,关心粮食和蔬菜
我有一所房子,面朝大海,春暖花开

从明天起,和每一个亲人通信
告诉他们我的幸福
那幸福的闪电告诉我的
我将告诉每一个人

给每一条河每一座山取一个温暖的名字
陌生人,我也为你祝福
希望你有一个灿烂的前程
你有情人终成眷属
希望你在尘世获得幸福
只希望面朝大海,春暖花开”

百思不得其解,请老司机指点。

  1. # 4 替换文字

  2. #输入
  3. file_name = input("请输入文件名:")
  4. old_str = input("请输入需要替换的单词或字符:")
  5. new_str = input("请输入新的单词或字符:")
  6. count = 0

  7. file = open(file_name, 'r+')

  8. #替换
  9. def tihuan(x,y):
  10.     local = 0
  11.     global count
  12.     for each_line in file:
  13.         for each in each_line:
  14.             if each == x:
  15.                 count += 1
  16.         each_line = each_line.replace(x, y)
  17.         print(each_line,end='')
  18.         file.seek(local, 0)
  19.         file.writelines(each_line)
  20.         local = file.tell()

  21. # 输出
  22. tihuan(old_str, new_str)
  23. print("文件%s中共有%s个【%s】" % (file_name, count, old_str))
  24. print("您确定要把%s替换成%s吗?" % (old_str, new_str))
  25. answer = input("【YES/NO】:")
  26. if answer == "YES":
  27.     file.close()
复制代码
最佳答案
2018-2-1 10:29:25
这个错误算是一个比较常见的错误了。
python中这个for循环虽然好用,但是你却不能在循环的过程中去改变“容器”。

也就是说 【for each_line in file:】在这个循环之中,file是一个容器,每次循环都从里面提取一行。在循环之中你可以用file中的东西,但是却不能改变file中的东西,否则就会出现你的错误。

修改意见:
不要在for循环中直接修改file内容,把要修改的字符先放到一个列表里面保存起来,等循环结束在写入到file之中
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2018-2-1 07:22:09 From FishC Mobile | 显示全部楼层
哪里不理解?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-2-1 09:40:18 | 显示全部楼层

原文件件里
“愿你有一个灿烂的前程
愿你有情人终成眷属
愿你在尘世获得幸福
我只愿面朝大海,春暖花开”
“愿”替换成“希望”,代码执行结果,却变成了:
“希望你有一个灿烂的前程
你有情人终成眷属
希望你在尘世获得幸福
只希望面朝大海,春暖花开”
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-2-1 10:01:51 | 显示全部楼层
jcx1117 发表于 2018-2-1 09:40
原文件件里
“愿你有一个灿烂的前程
愿你有情人终成眷属

你的19行是不是缩进有点问题?应该和17行对齐吧
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-2-1 10:29:25 | 显示全部楼层    本楼为最佳答案   
这个错误算是一个比较常见的错误了。
python中这个for循环虽然好用,但是你却不能在循环的过程中去改变“容器”。

也就是说 【for each_line in file:】在这个循环之中,file是一个容器,每次循环都从里面提取一行。在循环之中你可以用file中的东西,但是却不能改变file中的东西,否则就会出现你的错误。

修改意见:
不要在for循环中直接修改file内容,把要修改的字符先放到一个列表里面保存起来,等循环结束在写入到file之中
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-2-2 00:35:55 | 显示全部楼层
shuofxz 发表于 2018-2-1 10:29
这个错误算是一个比较常见的错误了。
python中这个for循环虽然好用,但是你却不能在循环的过程中去改变“ ...

刚看了课后习题给出的答案,居然也有这一句:
这个似乎也是在for语句没有结束的时候,改变“容器”的内容了,我该怎么理解呢,又有点迷茫了
   

  1. for eachline in f_read:
  2.         if rep_word in eachline:
  3.             count = eachline.count(rep_word) #count感觉应该用这个
  4.             eachline = eachline.replace(rep_word, new_word)
  5.         content.append(eachline)  
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-2-2 09:56:56 | 显示全部楼层
jcx1117 发表于 2018-2-2 00:35
刚看了课后习题给出的答案,居然也有这一句:
这个似乎也是在for语句没有结束的时候,改变“容器”的内 ...

哪里改变容器内容了?

对于for的容器是【f_read】呀,每次循环都是从f_read中取一行出来并赋值给eachline,并没有改变它呀。

或者你是指的“content”? 这个不算呀,for每次循环的时候,不是从这个里面取值给eachline呀。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-2-2 10:21:04 | 显示全部楼层
shuofxz 发表于 2018-2-2 09:56
哪里改变容器内容了?

对于for的容器是【f_read】呀,每次循环都是从f_read中取一行出来并赋值给eachl ...

我仔细想了下,似乎是没改变,之前误认为eachline就是容器中的一部分,现在想明白了,只要没有执行f_read.writelines()就不算改变容器,这么理解没错吧?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-2-2 10:41:53 | 显示全部楼层
jcx1117 发表于 2018-2-2 10:21
我仔细想了下,似乎是没改变,之前误认为eachline就是容器中的一部分,现在想明白了,只要没有执行f_read ...

嗯,基本没问题。

不过,不光是writelines(),其他对文件有写入或清除操作的函数都不行。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-3-6 16:20

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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