我想使用以下脚本从一个大的fasta文件中提取特定的fasta序列,但输出为空。
transcripts.txt
文件包含我要导出的列表转录ID(ID和序列),从assembly.fasta
到selected_transcripts.fasta
。
例如:
Transcript_00004|5601 Transcript_00005|5352
>Transcript_00004|5601 GATCTGGCGCTGAGCTGGGTGCTGATCGACCCGGCGTCCGGCCGCTCCGTGAACGCCTCGAGTCGGCGCCCGGTGTGCGTTGACCGGAGATCGCGATCTGGGGAGACCGTCGTGCGGTT >Transcript_00004|5360 CGATCTGGCGCTGAGCTGGGTGCTGATCGACCCGGCGTCCGGCCGCTCCGTGAACGCCTCGAGTCGGCGCCCGGTGTGCGTTGACCGGAGATCGCGATCTGGGGAGACCGTCGTGCGGTT
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()
答案 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
进行比较时在字符串中出现换行符。