鱼C论坛

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

[已解决]大神来解答

[复制链接]
发表于 2023-7-22 22:08:20 | 显示全部楼层 |阅读模式
10鱼币
原程序替换正常,但是是改写原文件
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[1:]  # 如果需要删除行,则将列表的第一行移除

        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[1:]  # 如果需要删除行,则将列表的第一行移除

        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)
最佳答案
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[1:]  # 如果需要删除行,则将列表的第一行移除

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

最佳答案

查看完整内容

你的函数 Modify_String_TXT 在你的第一个示例中是以"原地修改"的形式进行的,即在原始文件中进行字符串替换和行移除操作。而在你的第二个示例中,你在函数中添加了一个新的参数 output_file ,并在读取 input_file 之后,将修改后的内容写入新的文件 output_file 。 问题在于,你在每次调用 Modify_String_TXT 函数时,都会清空输出文件,然后再写入内容。在你的示例中,你调用了三次这个函数,每次调用都会清空输出文件然后再 ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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[1:]  # 如果需要删除行,则将列表的第一行移除

    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)
这样,就可以在一个函数调用中处理所有的字符串替换,并且只写入一次文件,保留了所有的修改内容。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

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

使用道具 举报

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

没看出你的代码和我发的修改代码有什么区别?是不是复制错了?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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


去这个帖子贴一下,也给你最佳https://fishc.com.cn/thread-231173-1-1.html
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-22 09:46

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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