黄jz 发表于 2020-7-25 17:33:51

求助

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=eachline[:count2]+eachline+eachline
            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=eachline[:count2]+eachline+eachline
IndexError: string index out of range

nahongyan1997 发表于 2020-7-25 17:54:25

本帖最后由 nahongyan1997 于 2020-7-25 17:56 编辑

count2+1:是什么意思??


你这代码全是 BUG 。

堕落之翼 发表于 2020-7-25 17:56:23

eachline
你这个索引在最后一个循环的时候出现了下标越界

nahongyan1997 发表于 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=eachline[:count2]+eachline+eachline
    #
    #   # 这两句有什么用 ??
    #      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()

nahongyan1997 发表于 2020-7-25 18:16:16

堕落之翼 发表于 2020-7-25 17:56
eachline
你这个索引在最后一个循环的时候出现了下标越界

请看代码

Twilight6 发表于 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('替换完成!')


黄jz 发表于 2020-7-25 18:40:39

堕落之翼 发表于 2020-7-25 17:56
eachline
你这个索引在最后一个循环的时候出现了下标越界

a='1'
a
a
''
这样也算下标越界把。那为什么这样会返回一个空字符串。。。
页: [1]
查看完整版本: 求助