鱼C论坛

 找回密码
 立即注册
查看: 1197|回复: 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 上即可

帮你改了下代码,完整代码如下,因为不用切片了,所以很多多余的参数我都帮你去掉了哈~:
name=input("请输入文件名:")
str1=input("请输入需要替换的单词或字符:")
str2=input("请输入新的单词或字符:")
count1=0

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

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

if judge == "yes":
    f1=open(name,'w',encoding='utf-8')
    list2 = []
    for eachline in list1:
        if str1 in eachline:
            eachline = eachline.replace(str1,str2)
        list2.append(eachline)
        print(eachline)
    f1.writelines(list2)
    f1.close()
    print('替换完成!')


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

count2+1:是什么意思??


你这代码全是 BUG 。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-25 17:56:23 | 显示全部楼层
eachline[count2+1:]
你这个索引在最后一个循环的时候出现了下标越界
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-25 18:15:44 | 显示全部楼层
请看代码:
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
    # 这样修改:
    if str1 in each_line:
        count += 1
        
    list1.append(eachline)
    
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
    # 这样改:
    
    list2 = []
    for each_line in list1:
        if str1 in each_line:
            # 用字符串的替换方法
            each_line.replace(str1,str2)
        list2.append(each_line)

    # 完成!!!!!
    str3=''
    for i in list2:
        str3=str3+i
f1.write(str3)
f1.close()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

请看代码
想知道小甲鱼最近在做啥?请访问 -> 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 上即可

帮你改了下代码,完整代码如下,因为不用切片了,所以很多多余的参数我都帮你去掉了哈~:
name=input("请输入文件名:")
str1=input("请输入需要替换的单词或字符:")
str2=input("请输入新的单词或字符:")
count1=0

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

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

if judge == "yes":
    f1=open(name,'w',encoding='utf-8')
    list2 = []
    for eachline in list1:
        if str1 in eachline:
            eachline = eachline.replace(str1,str2)
        list2.append(eachline)
        print(eachline)
    f1.writelines(list2)
    f1.close()
    print('替换完成!')


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

使用道具 举报

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

a='1'
a[2]
a[2:]
''
这样也算下标越界把。那为什么这样会返回一个空字符串。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-19 20:36

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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