Как преобразовать многострочные файлы fasta в однострочные файлы fasta без биопиона

1

У меня есть несколько больших файлов 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')
Теги:

1 ответ

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню