如何在不使用biopython的情况下将多行fasta文件转换为单行fasta文件

时间:2018-06-14 11:31:02

标签: python

我有几个大的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')

2 个答案:

答案 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')