鱼C论坛

 找回密码
 立即注册
查看: 56|回复: 4

[作品展示] 一个文件的全部替换功能

[复制链接]
发表于 前天 10:55 | 显示全部楼层 |阅读模式

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

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

x
鱼鱼们早上好
这是我看旧版课程写出的文件替换,因为自己不会而想分享一下,不是全自己写的,思路说是话好多问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 替换
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 前天 10:56 | 显示全部楼层
鱼油你好!很高兴看到你分享代码并积极学习。你的思路基本正确,但代码中有几个关键问题需要修正。我来帮你优化一下:


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

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

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

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

  27. # 获取用户输入
  28. file_name = input('请输入文件名: ')
  29. rep_name = input('请输入需要替换的旧内容: ')
  30. new_name = input('请输入新内容: ')
  31. Replace(file_name, rep_name, new_name)
复制代码


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

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

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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 前天 14:42 | 显示全部楼层
  1. file_name = input('请输入文件名:')      #file文件名
  2. rep_name  = input('请输入旧内容:')      #rep代表名
  3. new_name  = input('请输入新内容:')      #new新名
  4. fp = open(file_name , 'r+')
  5. s = fp . read()
  6. r = new_name . join(s . split(rep_name)) #替换
  7. fp . seek(0 , 0)
  8. fp . write(r)
  9. fp . close()
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 前天 19:49 | 显示全部楼层

大佬,晚上好,谢谢啊真厉害,我去百度搜索才看懂得,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()  # 关闭文件
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

        理解基本正确,下面是理解有偏差的地方
  1. fp = open(file_name , 'r+')               # 以文本读写模式打开文件
  2. s  = fp . read()                          # 读取整个文件的文本内容到 s
  3. r  = new_name . join(s . split(rep_name)) # 以 rep_name 为分隔符,将字符串 s 打断为若干片段,再以 new_name 为媒介,将所有被打断的字符串片段拼接起来成为 r
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-10-25 01:47

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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