从大的fasta文件中提取特定的fasta序列

时间:2016-05-13 17:30:31

标签: python biopython

我想使用以下脚本从一个大的fasta文件中提取特定的fasta序列,但输出为空。

transcripts.txt文件包含我要导出的列表转录ID(ID和序列),从assembly.fastaselected_transcripts.fasta。 例如:

  1. transcripts.txt:
    Transcript_00004|5601
    Transcript_00005|5352
  2. assembly.fasta:
    >Transcript_00004|5601
    GATCTGGCGCTGAGCTGGGTGCTGATCGACCCGGCGTCCGGCCGCTCCGTGAACGCCTCGAGTCGGCGCCCGGTGTGCGTTGACCGGAGATCGCGATCTGGGGAGACCGTCGTGCGGTT
    >Transcript_00004|5360
    CGATCTGGCGCTGAGCTGGGTGCTGATCGACCCGGCGTCCGGCCGCTCCGTGAACGCCTCGAGTCGGCGCCCGGTGTGCGTTGACCGGAGATCGCGATCTGGGGAGACCGTCGTGCGGTT
    
  3. ID前面有>符号:>Transcripts_00004|5601

    我必须阅读assembly.fasta文件,如果assembly.fasta中的成绩单ID与transcripts.txt中的成绩单相同,我必须在selected_transcripts.fasta中写下此成绩单ID及其序列{1}}。所以,在上面的例子中,我只需要写第一个成绩单。

    有什么建议吗? 感谢。

    from Bio import SeqIO
    
    my_list = [line.split(',') for line in open("/home/universita/transcripts.txt")]
    
    fin = open('/home/universita/assembly.fasta', 'r')
    fout = open('/home/universita/selected_transcripts.fasta', 'w')
    
    for record in SeqIO.parse(fin,'fasta'):
        for item in my_list:
            if item == record.id:
                fout.write(">" + record.id + "\n")
                fout.write(record.seq + "\n")
    
    fin.close()
    fout.close()
    

1 个答案:

答案 0 :(得分:1)

根据你的例子,有一些小问题可以解释为什么你什么都得不到。您的transcripts.txt在一行中有多个条目,因此my_list将包含my_line[0]中first_line的所有项目,在您的循环中按行重复my_list,所以第一项将是

['Transcript_00004|5601', 'Transcript_00005|5352']

如果标题行中assembly.fasta没有>,您将无法获取包含ID和序列的任何记录。假设您在标题中添加了>并且split函数现在使用的是空格而不是冒号,以下代码应该处理这些问题。

from Bio import SeqIO

my_list = []
with open("transcripts.txt") as transcripts:
    for line in transcripts:
        my_list.extend(line.split(' '))

fin = open('assembly.fasta', 'r')
fout = open('selected_transcripts.fasta', 'w')

for record in SeqIO.parse(fin,'fasta'):
    for item in my_list:
        if item.strip() == record.id:
            fout.write(">" + record.id + "\n")
            fout.write(record.seq + "\n")


fin.close()
fout.close()

更改了成绩单的阅读,以便所有ID分别附加到my_list。此外,每个项目都被剥去了空白区域,以避免在与record.id进行比较时在字符串中出现换行符。