qasa 发表于 2025-10-23 10:55:05

一个文件的全部替换功能

鱼鱼们早上好
这是我看旧版课程写出的文件替换,因为自己不会而想分享一下,不是全自己写的,思路说是话好多问AI的,
而且字符串的内置几乎都没记住全靠鱼总的扩展阅读
哪里错了请指正,谢谢
有更好的办法完善更好,我也好学学,谢谢啦
我没运行,我没运行,我没运行
这是个半成品
# 编写一个程序,实现“全部替换”功能。
# 流程:
# 用户——输入需要替换的文件名字——需要替换的单词或者字符串——输入新的单词或字符串
# 我方——接受对方文件名——接受对方单词or字符串——接受对方新的单词or字符串
#设置函数需要三个传入参数(因为—接受对方文件名—接受对方单词or字符串—接受对方新的单词or字符串)
#打开临时只读文件——处理文件替换需要用什么 1.空列表用于存储处理后的每一行内容2.计数器归零,用于统计总共要替换的单词数量
#所以需要用两个初始变量 一个赋值空列表 一个赋值为0
#因为要全部替换 所以要把文件全都过滤 要用 for XX in 打开文件:
# 把 临时过滤赋值 插入 旧内容 , 计算次数,替换文件到新文件因为之前建立用的 列表    所以要用列表的方式
#增加确定项目 判断 用户输入 确定打开 临时写入文件 把之前的列表写入临时写入文件 关闭临时写入 关闭临时只读
def Replace(file_name,rep_name,new_name):
    f_read = open(file_name,'r',encoding='utf-8')
    none_list = [ ]
    count = 0
    for filter_content in f_read:#   filter _ content过滤器 _ 内容
      if rep_name == filter_content:
            count = filter_content.count(rep_name) + count
            filter_content = filter_content.replace(rep_name,new_name)
      none_list.append(filter_content)#把过滤器内容添加到建立的空列表中
            #{ .count(sub[, 起始位[, 结束位]])   }返回 sub 在字符串中不重叠的出现次数,可选参数起始结束
            #replace(old, new, count=-1)返回一个将所有 old 参数指定的子字符串替换为 new 的新字符串;
            # count 参数指定替换的次数,默认是 -1,表示替换全部
      Determine_the_project = input(f'''{file_name}文件的{rep_name}内容共{count}全部替换为{new_name}新内容吗?\n
                                        如果确认请输入 : _yes_\n如果不确认请输入: _no_\n''')
      if Determine_the_project == '_yes_':
            f_write = open(file_name,'w',encoding='utf-8')
            f_write.writelines(none_list)
            f_write.close()
      
      f_read.close()

file_name = input('请输入文件名') #file文件名
rep_name = input('请输入需要替换的旧内容')#rep代表名
new_name = input('请输入代替旧内容的新内容')#new新名
Replace(file_name,rep_name,new_name)# Replace 替换

FishC 发表于 2025-10-23 10:56:37

鱼油你好!很高兴看到你分享代码并积极学习。你的思路基本正确,但代码中有几个关键问题需要修正。我来帮你优化一下:


def Replace(file_name, rep_name, new_name):
    # 读取文件内容并处理替换
    with open(file_name, 'r', encoding='utf-8') as f_read:
      lines = f_read.readlines()# 读取所有行到列表

    new_lines = []# 存储替换后的行
    total_count = 0# 总替换次数计数器

    # 遍历每一行进行处理
    for line in lines:
      # 统计当前行中旧内容出现的次数
      count_in_line = line.count(rep_name)
      total_count += count_in_line
      
      # 替换当前行中的旧内容为新内容
      new_line = line.replace(rep_name, new_name)
      new_lines.append(new_line)

    # 询问用户确认(放在循环外,只问一次)
    if total_count > 0:
      confirm = input(f"文件{file_name}中共发现{total_count}个'{rep_name}',是否全部替换为'{new_name}'?(输入yes确认): ")
      if confirm.lower() == 'yes':
            with open(file_name, 'w', encoding='utf-8') as f_write:
                f_write.writelines(new_lines)
            print("替换完成!")
      else:
            print("已取消替换。")
    else:
      print("未找到需要替换的内容。")

# 获取用户输入
file_name = input('请输入文件名: ')
rep_name = input('请输入需要替换的旧内容: ')
new_name = input('请输入新内容: ')
Replace(file_name, rep_name, new_name)


主要修正点说明:
1. 使用 with open() 自动处理文件关闭,更安全
2. 将用户确认提示移到循环外,避免重复询问
3. 修正了计数逻辑,先统计再替换
4. 添加了未找到内容时的提示
5. 变量命名更清晰(如 new_lines)

优化建议:
- 如果文件很大,可以逐行处理写入临时文件,最后再覆盖原文件
- 可以增加文件存在性检查(用 os.path.exists())
- 替换前可以预览更改内容

继续加油!多动手运行调试能更快进步~

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

jackz007 发表于 2025-10-23 14:42:27

file_name = input('请输入文件名:')      #file文件名
rep_name= input('请输入旧内容:')      #rep代表名
new_name= input('请输入新内容:')      #new新名
fp = open(file_name , 'r+')
s = fp . read()
r = new_name . join(s . split(rep_name)) #替换
fp . seek(0 , 0)
fp . write(r)
fp . close()

qasa 发表于 2025-10-23 19:49:26

jackz007 发表于 2025-10-23 14:42


大佬,晚上好,谢谢啊真厉害,我去百度搜索才看懂得,join不知道什么意思现在懂了
file_name = input('请输入文件名:')      #file文件名
rep_name= input('请输入旧内容:')      #rep代表名
new_name= input('请输入新内容:')      #new新名
fp = open(file_name , 'r+')   #fp是打开文件以 可读写的二进制模式
s = fp . read()# 读取文件转化为字符串
r = new_name . join(s . split(rep_name)) #替换   # 以旧内容为分隔符将分割的字符串添加在新内容后 赋值为r
fp . seek(0 , 0) #文件指针重置
fp . write(r)#文件写入新内容
fp . close()# 关闭文件

jackz007 发表于 2025-10-23 20:06:45

qasa 发表于 2025-10-23 19:49
大佬,晚上好,谢谢啊真厉害,我去百度搜索才看懂得,join不知道什么意思现在懂了
file_name = input(' ...

      理解基本正确,下面是理解有偏差的地方
fp = open(file_name , 'r+')               # 以文本读写模式打开文件
s= fp . read()                        # 读取整个文件的文本内容到 s
r= new_name . join(s . split(rep_name)) # 以 rep_name 为分隔符,将字符串 s 打断为若干片段,再以 new_name 为媒介,将所有被打断的字符串片段拼接起来成为 r
页: [1]
查看完整版本: 一个文件的全部替换功能