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
相关产品推荐
相关产品推荐

