鱼C论坛

 找回密码
 立即注册
查看: 1357|回复: 6

[已解决]求助

[复制链接]
发表于 2020-7-25 17:33:51 | 显示全部楼层 |阅读模式

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

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

x
name=input("请输入文件名:")
str1=input("请输入需要替换的单词或字符:")
str2=input("请输入新的单词或字符:")
count1=0
count2=0
count3=0
list1=[]
list2=[]
f1=open(name,encoding='utf-8')
for eachline in f1:
    list1.append(eachline)
    for i in eachline:
        if i== str1:
            count1=count1+1
f1.close()
print("文件",name,"中共有",count1,"个【",str1,"】")
print("您确定把所有的【",str1,"】替换为【",str2,"】吗:")
judge=input("【yes/no】:")
if judge == "yes":
    f1=open(name,'w')
    list2=list1
    for eachline in list2:
        for i in eachline:
            if i == str1:
               list2[count3]=eachline[:count2]+eachline[count2]+eachline[count2+1:]
            count2=count2+1
        count3=count3+1
    str3=''
    for i in list2:
        str3=str3+i
f1.write(str3)
f1.close()
   
        
上面是代码
下面是错误
请输入文件名:C:\\Users\\DRD\\Desktop\\something.txt
请输入需要替换的单词或字符:愿
请输入新的单词或字符:希望
文件 C:\\Users\\DRD\\Desktop\\something.txt 中共有 4 个【 愿 】
您确定把所有的【 愿 】替换为【 希望 】吗:
【yes/no】:yes
Traceback (most recent call last):
  File "G:/新建文件夹 (4)/24.py", line 25, in <module>
    list2[count3]=eachline[:count2]+eachline[count2]+eachline[count2+1:]
IndexError: string index out of range
最佳答案
2020-7-25 18:36:28
本帖最后由 Twilight6 于 2020-7-25 18:37 编辑



实际上用 list(f1) 或者 f1.readlines() 方法都是直接将文本内容一行一行的读取存为列表,所以这里直接用这两个其中一个方法即可,不用 for 循环一个个添加入列表

建议不要用字符串切片方法来拼接字符串,很容易把自己搞晕的,建议直接用字符串方法 str.replace(old,new),将旧字符串,转为新字符串

然后最后你可以将替换完的字符串添加入另一个列表,或者在原列表上进行改变,用文件方法 writeline() 将列表中的字符串直接写入文件中去

然后你判断字符出现的次数,也可用字符串方法 str.count() 来直接记录,然后加上 count1 上即可

帮你改了下代码,完整代码如下,因为不用切片了,所以很多多余的参数我都帮你去掉了哈~:

  1. name=input("请输入文件名:")
  2. str1=input("请输入需要替换的单词或字符:")
  3. str2=input("请输入新的单词或字符:")
  4. count1=0

  5. f1=open(name,encoding='utf-8')
  6. list1= list(f1)

  7. f1.close()
  8. for i in list1:
  9.     if i.count(str1):
  10.         count1=count1+i.count(str1)
  11. print("文件",name,"中共有",count1,"个【",str1,"】")
  12. print("您确定把所有的【",str1,"】替换为【",str2,"】吗:")
  13. judge=input("【yes/no】:")

  14. if judge == "yes":
  15.     f1=open(name,'w',encoding='utf-8')
  16.     list2 = []
  17.     for eachline in list1:
  18.         if str1 in eachline:
  19.             eachline = eachline.replace(str1,str2)
  20.         list2.append(eachline)
  21.         print(eachline)
  22.     f1.writelines(list2)
  23.     f1.close()
  24.     print('替换完成!')
复制代码



小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-7-25 17:54:25 | 显示全部楼层
本帖最后由 nahongyan1997 于 2020-7-25 17:56 编辑

count2+1:是什么意思??


你这代码全是 BUG 。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-25 17:56:23 | 显示全部楼层
eachline[count2+1:]
你这个索引在最后一个循环的时候出现了下标越界
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-25 18:15:44 | 显示全部楼层
请看代码:
  1. name=input("请输入文件名:")
  2. str1=input("请输入需要替换的单词或字符:")
  3. str2=input("请输入新的单词或字符:")
  4. count1=0
  5. count2=0
  6. count3=0
  7. list1=[]
  8. list2=[]
  9. f1=open(name,encoding='utf-8')
  10. for eachline in f1:
  11.     # 这句放在后面
  12.     #list1.append(eachline)
  13.     # 这里只能迭代出一个字符,所以当你要索引两个字的词语时就会报错
  14.     #for i in eachline:
  15.     #   if i == str1:
  16.     #        count1=count1+1
  17.     # 这样修改:
  18.     if str1 in each_line:
  19.         count += 1
  20.         
  21.     list1.append(eachline)
  22.    
  23. f1.close()
  24. print("文件",name,"中共有",count1,"个【",str1,"】")
  25. print("您确定把所有的【",str1,"】替换为【",str2,"】吗:")
  26. judge=input("【yes/no】:")
  27. if judge == "yes":
  28.     f1=open(name,'w')
  29.     # list2=list1
  30.     # 这段代码也有错误,理由同上
  31.     #for eachline in list2:
  32.     #    for i in eachline:
  33.     #        if i == str1:
  34.     #            # 这里没理解   
  35.     #            # list2[count3]=eachline[:count2]+eachline[count2]+eachline[count2+1:]
  36.     #
  37.     #   # 这两句有什么用 ??
  38.     #        count2=count2+1
  39.     #    count3=count3+1
  40.     # 这样改:
  41.    
  42.     list2 = []
  43.     for each_line in list1:
  44.         if str1 in each_line:
  45.             # 用字符串的替换方法
  46.             each_line.replace(str1,str2)
  47.         list2.append(each_line)

  48.     # 完成!!!!!
  49.     str3=''
  50.     for i in list2:
  51.         str3=str3+i
  52. f1.write(str3)
  53. f1.close()
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-25 18:16:16 | 显示全部楼层
堕落之翼 发表于 2020-7-25 17:56
eachline[count2+1:]
你这个索引在最后一个循环的时候出现了下标越界

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

使用道具 举报

发表于 2020-7-25 18:36:28 | 显示全部楼层    本楼为最佳答案   
本帖最后由 Twilight6 于 2020-7-25 18:37 编辑



实际上用 list(f1) 或者 f1.readlines() 方法都是直接将文本内容一行一行的读取存为列表,所以这里直接用这两个其中一个方法即可,不用 for 循环一个个添加入列表

建议不要用字符串切片方法来拼接字符串,很容易把自己搞晕的,建议直接用字符串方法 str.replace(old,new),将旧字符串,转为新字符串

然后最后你可以将替换完的字符串添加入另一个列表,或者在原列表上进行改变,用文件方法 writeline() 将列表中的字符串直接写入文件中去

然后你判断字符出现的次数,也可用字符串方法 str.count() 来直接记录,然后加上 count1 上即可

帮你改了下代码,完整代码如下,因为不用切片了,所以很多多余的参数我都帮你去掉了哈~:

  1. name=input("请输入文件名:")
  2. str1=input("请输入需要替换的单词或字符:")
  3. str2=input("请输入新的单词或字符:")
  4. count1=0

  5. f1=open(name,encoding='utf-8')
  6. list1= list(f1)

  7. f1.close()
  8. for i in list1:
  9.     if i.count(str1):
  10.         count1=count1+i.count(str1)
  11. print("文件",name,"中共有",count1,"个【",str1,"】")
  12. print("您确定把所有的【",str1,"】替换为【",str2,"】吗:")
  13. judge=input("【yes/no】:")

  14. if judge == "yes":
  15.     f1=open(name,'w',encoding='utf-8')
  16.     list2 = []
  17.     for eachline in list1:
  18.         if str1 in eachline:
  19.             eachline = eachline.replace(str1,str2)
  20.         list2.append(eachline)
  21.         print(eachline)
  22.     f1.writelines(list2)
  23.     f1.close()
  24.     print('替换完成!')
复制代码



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

使用道具 举报

 楼主| 发表于 2020-7-25 18:40:39 | 显示全部楼层
堕落之翼 发表于 2020-7-25 17:56
eachline[count2+1:]
你这个索引在最后一个循环的时候出现了下标越界

a='1'
a[2]
a[2:]
''
这样也算下标越界把。那为什么这样会返回一个空字符串。。。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-24 04:42

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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