You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 19:05:10