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

Python文本解析:拆分多序列文件时如何保留带>的序列头?

序列拆分时保留含'>'的序列头行问题

我有一个包含多序列的比对结果文本文件,希望将每个序列拆分到独立的新文本文件中。目前已能通过字符'>'检测序列并完成拆分,但生成的新文件缺失了含'>'的序列头行。

现有代码:

with open("result.txt",'r') as fo:
    start=0
    op= ' '
    cntr=1
    # print(fo.readlines())
    for x in fo.readlines():
        # print(x)
        if (x[0]== '>'):
            if (start==1):
                with open(str(cntr)+'.txt','w') as opf:
                    opf.write(op)
                    opf.close()
                    op= ' '
                    cntr+=1
            else:
                start=1   
        else:
            if (op==''):
                op=x
            else:
                op= op + '\n' + x
    fo.close()
    print('completed') 

期望每个新文件开头为:

>P51051.1 RecName: Full=Melatonin receptor type 1B; Short=Mel-1B-R; Short=Mel1b 
receptor [Xenopus laevis]
Length=152 

但当前生成的文件开头是:

receptor [Xenopus laevis]
Length=152

修改方案

问题核心是原代码完全跳过了含'>'的行,没有将其加入到待写入的内容中。调整逻辑,把'>'行作为每个序列的起始部分即可:

修改后的代码:

with open("result.txt",'r') as fo:
    op = ''
    cntr = 1
    for x in fo.readlines():
        # 检测到新的序列头
        if x.startswith('>'):
            # 若已有未写入的序列内容,先写入文件
            if op:
                with open(f"{cntr}.txt", 'w') as opf:
                    opf.write(op.strip('\n'))
                cntr += 1
                op = ''
            # 将当前序列头加入待写入内容
            op = x
        else:
            # 追加序列内容到待写入变量
            op += x
    # 处理最后一个未写入的序列
    if op:
        with open(f"{cntr}.txt", 'w') as opf:
            opf.write(op.strip('\n'))
    print('completed')

修改说明

  • 移除冗余的start变量,直接通过op是否为空判断是否存在未写入的序列
  • 遇到'>'行时,先完成上一个序列的写入(如果有),再将当前'>'行作为新序列的起始
  • 补充了最后一个序列的写入逻辑(原代码会漏掉最后一个序列)
  • 加入strip('\n')避免文件末尾出现多余空行,可根据需求自行移除

内容的提问来源于stack exchange,提问作者BScpj

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 17:10:20