У меня есть несколько больших файлов 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')
Следующее будет обрабатывать ваш файл за один раз:
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