代码之家  ›  专栏  ›  技术社区  ›  Revan

如何将多行fasta文件转换为没有biopython的单行fasta文件

  •  1
  • Revan  · 技术社区  · 6 年前

    我有几个大的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 回复  |  直到 6 年前
        1
  •  2
  •   Martin Evans    6 年前

    以下操作将一次处理一行文件:

    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