Python文本处理:合并非set开头行至最近set行的逻辑优化求助
正确的文本合并处理方案
核心处理逻辑
- 逐行遍历文件(避免一次性加载大文件占用内存,同时规避修改列表引发的索引错位问题)
- 维护当前活跃的
set行组:遇到新的set开头行时,先输出上一组的合并结果,再初始化新组;非set行直接追加到当前组内容后 - 处理文件末尾剩余的未写入组内容
可直接运行的代码实现
def merge_set_lines(input_file, output_file): current_set = None # 同时打开输入输出文件,自动处理资源释放 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.rstrip('\n') cleaned_line = line.strip() if not cleaned_line: # 跳过空行,不需要的话可删除这两行 continue if cleaned_line.startswith('set'): # 先写入上一组的合并结果 if current_set is not None: f_out.write(current_set + '\n') # 初始化新的set行 current_set = cleaned_line else: # 非set行追加到当前set行后,这里用空格分隔,可按需修改分隔符 if current_set is not None: current_set += ' ' + cleaned_line # 处理文件最后一组未写入的内容 if current_set is not None: f_out.write(current_set + '\n') # 调用示例,替换成你的文件名 merge_set_lines('source.txt', 'merged_result.txt')
之前代码出错的常见原因
- 用
readlines一次性加载文件后,遍历列表时直接修改原列表(比如删除、插入行),导致索引错位,重复处理同一行甚至触发无限循环 - 未正确维护当前
set组的状态,比如初始化不及时、未在新set行出现时重置组内容,导致重复累积数据 - 大文件一次性加载到内存,不仅占用资源,还容易在复杂的列表操作中出现逻辑混乱
按需调整说明
- 若要保留原行的缩进或末尾格式,把
cleaned_line = line.strip()改成cleaned_line = line.rstrip('\n') - 非
set行和set行的分隔符可自定义,比如用逗号、分号,甚至换行(如果需要换行合并),修改current_set += ' ' + cleaned_line中的分隔符即可 - 处理非UTF-8编码的文件时,调整
open函数的encoding参数(比如gbk)
内容的提问来源于stack exchange,提问作者Nathan
相关产品推荐
相关产品推荐

