不使用fileinput inplace,Python中修改文件行并保留未修改行的方法
如何在修改匹配行的同时保留未匹配行到新文件?
我完全懂你遇到的这个问题——之前只把修改过的行写入新文件,没保留那些不需要改动的行,确实挺头疼的。其实核心思路很简单:遍历文件的每一行,对每行判断是否匹配关键词:匹配则修改后写入,不匹配则直接原封不动写入。下面给你两种实用的解决方案,适配不同的场景:
方案一:常规文件读写(直观易调试)
这种方式最容易理解,也方便调试,适合需要保留原文件、生成新文件的场景。假设你的需求是:当行包含[Thanos]时,把该行的第2、3个字符替换成AA(对应你提到的示例输出1AA34...),其他行保持不变。代码如下:
# 定义输入输出文件路径 input_file = "input.txt" output_file = "output.txt" lookup_keyword = "[Thanos]" # 同时打开输入和输出文件,自动处理关闭 with open(input_file, 'r', encoding='utf-8') as f_in, open(output_file, 'w', encoding='utf-8') as f_out: for line in f_in: # 先移除换行符,避免后续处理出现重复换行 line_content = line.rstrip('\n') if lookup_keyword in line_content: # 执行自定义修改逻辑:这里是把第2、3位(索引1、2)换成AA modified_line = line_content[:1] + "AA" + line_content[3:] # 写入修改后的行,加上换行符 f_out.write(modified_line + '\n') else: # 不匹配的行直接原封不动写入 f_out.write(line)
代码说明:
- 用
with语句管理文件,不用手动调用close(),避免资源泄漏 - 逐行读取输入文件,对每行做关键词匹配判断
- 匹配的行按照你的需求修改(这里的修改逻辑可以随便调整,比如替换特定字符、截取内容等)
- 不匹配的行直接写入输出文件,完全保留原有格式和内容
方案二:用fileinput做原地编辑(无需手动管理输出文件)
如果你不想单独生成新文件,而是直接修改原文件,fileinput的原地编辑模式就很合适——虽然你觉得它更适合关键词替换,但其实也能轻松实现你的需求:
import fileinput lookup_keyword = "[Thanos]" # inplace=True表示直接修改原文件,backup='.bak'会生成原文件的备份(防止误操作) for line in fileinput.input('input.txt', inplace=True, backup='.bak', encoding='utf-8'): line_content = line.rstrip('\n') if lookup_keyword in line_content: modified_line = line_content[:1] + "AA" + line_content[3:] print(modified_line) # fileinput会把print的内容写入原文件 else: print(line_content) # 不修改的行直接print,保留原内容
代码说明:
inplace=True会让程序把标准输出的内容重定向到原文件,实现原地修改backup='.bak'会在修改前自动生成原文件的备份(比如input.txt.bak),万一改坏了还能恢复- 同样的匹配逻辑:匹配则修改后打印,不匹配则直接打印原内容
一些实用提示:
- 灵活调整修改逻辑:不管你是要替换某个特定字符、修改某段内容,只需要修改
modified_line的生成代码即可 - 编码问题:如果你的文件是GBK等非UTF-8编码,记得在
open或fileinput里指定对应的encoding参数,避免乱码 - 先测试再实操:处理重要文件前,先用测试文件验证逻辑,确保修改和保留的行都符合预期
内容的提问来源于stack exchange,提问作者Izzat Z.
相关产品推荐
相关产品推荐

