ssqchina 发表于 2023-7-22 22:08:20

大神来解答

原程序替换正常,但是是改写原文件
def Modify_String_TXT(Find_String, Replace_String, input_file):
    with open(input_file, 'r+', encoding='UTF-8') as f:
      lines = f.readlines()# 读取文件的所有行
      lines_to_write = []# 存储要写入文件的行
      delete_line = False# 是否删除当前行的标志
      previous_line = None# 上一行内容

      for line in lines:
            if Find_String in line:
                line = line.replace(Find_String, Replace_String)

            if line.strip().startswith('8'):# 如果行以'8'开头,设置删除标志为True
                delete_line = True
            elif line.strip().startswith('4'):# 如果行以'4'开头,设置删除标志为True
                delete_line = True
            else:
                if line.strip() == previous_line:# 如果当前行与上一行内容相同,则跳过当前行
                  continue

                lines_to_write.append(line)# 将当前行添加到存储列表中
                previous_line = line.strip()# 更新上一行内容为当前行的内容

      if delete_line:
            lines_to_write = lines_to_write# 如果需要删除行,则将列表的第一行移除

      f.seek(0)# 将文件指针移到文件开头
      f.truncate()# 清空文件内容
      f.writelines(lines_to_write)# 将修改后的行写回文件

input_file = 'f:\\'+input('请输入f盘下要关键字替换的文件名')+'.txt'
Modify_String_TXT('        0', '0|0', input_file)
Modify_String_TXT('        3', '0|3', input_file)
Modify_String_TXT('        6', '1|6', input_file)


修改后新建了新文件,但是没替换,到底错在哪?
def Modify_String_TXT(Find_String, Replace_String, input_file, output_file):
    with open(input_file, 'r+', encoding='UTF-8') as f:
      lines = f.readlines()# 读取文件的所有行
      lines_to_write = []# 存储要写入文件的行
      delete_line = False# 是否删除当前行的标志
      previous_line = None# 上一行内容

      for line in lines:
            if Find_String in line:
                line = line.replace(Find_String, Replace_String)

            if line.strip().startswith('8'):# 如果行以'8'开头,设置删除标志为True
                delete_line = True
            elif line.strip().startswith('4'):# 如果行以'4'开头,设置删除标志为True
                delete_line = True
            else:
                if line.strip() == previous_line:# 如果当前行与上一行内容相同,则跳过当前行
                  continue

                lines_to_write.append(line)# 将当前行添加到存储列表中
                previous_line = line.strip()# 更新上一行内容为当前行的内容

      if delete_line:
            lines_to_write = lines_to_write# 如果需要删除行,则将列表的第一行移除

      with open(output_file, 'w', encoding='UTF-8') as f:
            f.writelines(lines_to_write)

input_file = 'f:\\'+input('请输入f盘下要关键字替换的文件名')+'.txt'
output_file = 'f:\\' + input('请输入f盘下要保存的文件名') + '.txt'
Modify_String_TXT('        0', '0|0', input_file, output_file)
Modify_String_TXT('        3', '0|3', input_file, output_file)
Modify_String_TXT('        6', '1|6', input_file, output_file)

isdkz 发表于 2023-7-22 22:08:21

你的函数 Modify_String_TXT 在你的第一个示例中是以"原地修改"的形式进行的,即在原始文件中进行字符串替换和行移除操作。而在你的第二个示例中,你在函数中添加了一个新的参数 output_file ,并在读取 input_file 之后,将修改后的内容写入新的文件 output_file 。

问题在于,你在每次调用 Modify_String_TXT 函数时,都会清空输出文件,然后再写入内容。在你的示例中,你调用了三次这个函数,每次调用都会清空输出文件然后再写入。因此,只有最后一次调用的修改会被保留,之前的两次调用修改的内容都会被清空。

为了修复这个问题,你应该在所有修改完成后,只写入一次文件。可以通过将所有的找寻与替换字符串对应关系放在一个字典中,然后在一个单独的函数调用中处理所有的替换,示例如下:

def Modify_String_TXT(Find_Replace_Dict, input_file, output_file):
    with open(input_file, 'r+', encoding='UTF-8') as f:
      lines = f.readlines()# 读取文件的所有行
      lines_to_write = []# 存储要写入文件的行
      delete_line = False# 是否删除当前行的标志
      previous_line = None# 上一行内容

      for line in lines:
            for find_str, replace_str in Find_Replace_Dict.items():
                if find_str in line:
                  line = line.replace(find_str, replace_str)

            if line.strip().startswith('8'):# 如果行以'8'开头,设置删除标志为True
                delete_line = True
            elif line.strip().startswith('4'):# 如果行以'4'开头,设置删除标志为True
                delete_line = True
            else:
                if line.strip() == previous_line:# 如果当前行与上一行内容相同,则跳过当前行
                  continue

                lines_to_write.append(line)# 将当前行添加到存储列表中
                previous_line = line.strip()# 更新上一行内容为当前行的内容

      if delete_line:
            lines_to_write = lines_to_write# 如果需要删除行,则将列表的第一行移除

    with open(output_file, 'w', encoding='UTF-8') as f:
      f.writelines(lines_to_write)

input_file = 'f:\\'+input('请输入f盘下要关键字替换的文件名')+'.txt'
output_file = 'f:\\' + input('请输入f盘下要保存的文件名') + '.txt'
Find_Replace_Dict = {'      0': '0|0', '      3': '0|3', '      6': '1|6'}
Modify_String_TXT(Find_Replace_Dict, input_file, output_file)

这样,就可以在一个函数调用中处理所有的字符串替换,并且只写入一次文件,保留了所有的修改内容。

ssqchina 发表于 2023-7-22 22:13:32

陶远航 发表于 2023-7-22 22:08
在你提供的代码中,存在一个问题。在第一个代码段中,虽然你使用了参数input_file指定了输入文件,但是没有 ...

机器人回答问题?

ssqchina 发表于 2023-7-22 22:20:38

Mike_python小 发表于 2023-7-22 22:08
问题可能出在原始文件未被正确修改的地方。在第一个程序中,你使用了f.seek(0)和f.truncate()来清空文件内 ...

没看出你的代码和我发的修改代码有什么区别?是不是复制错了?

ssqchina 发表于 2023-7-22 23:00:56

isdkz 发表于 2023-7-22 22:08
你的函数 Modify_String_TXT 在你的第一个示例中是以"原地修改"的形式进行的,即在原始文件中进行字符串替 ...

去这个帖子贴一下,也给你最佳https://fishc.com.cn/thread-231173-1-1.html
页: [1]
查看完整版本: 大神来解答