我有几个大的fasta文件,序列保存在多行中。
>header1
AGTCGTAGCTACGTACGTACGTGTACGTACGTA
TGACGTACGTAGCTGCATGCTA
>header2
TGCAGATCGTAGTCGATGCTAGTGCATGCATGT
ACGTAGTGCAG
...
我想将其转换为fasta文件,其中序列组合成一行。
>header1
AGTCGTAGCTACGTACGTACGTGTACGTACGTATGACGTACGTAGCTGCATGCTA
>header2
TGCAGATCGTAGTCGATGCTAGTGCATGCATGTACGTAGTGCAG
...
我的fasta文件非常大,所以我需要一种节省内存的方法(因为序列文件比我的内存大)。因此我不能使用Biopython(下面有一个解决我的Biopython问题的方法,如果这对任何人都有帮助,这来自Biostars)。
from Bio import SeqIO
import re
def multi2linefasta(indir,outdir,filelist):
for items in filelist:
mfasta = outdir +"/"+re.sub('\..*','',items)+'_twoline.fasta'
ifile = open(indir+'/'+items,'rU')
with open(mfasta, 'w') as ofile:
for record in SeqIO.parse(ifile, "fasta"):
sequence = str(record.seq)
ofile.write('>'+record.id+'\n'+sequence+'\n')
答案 0 :(得分:2)
以下内容将一次处理您的文件:
with open('input.fasta') as f_input, open('output.fasta', 'w') as f_output:
block = []
for line in f_input:
if line.startswith('>header'):
if block:
f_output.write(''.join(block) + '\n')
block = []
f_output.write(line)
else:
block.append(line.strip())
if block:
f_output.write(''.join(block) + '\n')
给你一个output.fasta
包含:
>header1
AGTCGTAGCTACGTACGTACGTGTACGTACGTATGACGTACGTAGCTGCATGCTA
>header2
TGCAGATCGTAGTCGATGCTAGTGCATGCATGTACGTAGTGCAG
答案 1 :(得分:1)
使用以下答案,所有ID和序列将在同一行中,我想在一行中获取标头,并在另一行中获取该序列的所有行。
with open('input.fasta') as f_input, open('output.fasta', 'w') as f_output:
block = []
for line in f_input:
if line.startswith('>header'):
if block:
f_output.write(''.join(block) + '\n')
block = []
f_output.write(line)
else:
block.append(line.strip())
if block:
f_output.write(''.join(block) + '\n')