我正在开发一个程序,让用户输入他们想要在FASTA文件中找到的序列,之后程序会显示描述行和属于它的序列。 FASTA可以在hugheslab.ccbr.utoronto.ca/supplementary-data/IRC/IRC_representative_cdna.fa.gz找到,大约是。 87 MB。
我们的想法是首先创建一个包含描述行位置的列表,该列表始终以>开头。一旦知道了什么是描述行,就可以在两个描述行之间的行中搜索search_term。这正是在第四段中所做的,这导致了一个48425长的列表,这里是结果的概念:http://imgur.com/Lxy8hnI
现在第五段意味着在两个描述行之间进行搜索,让我们以第0行和第15行为例,这将是description_list [a]和description_list [a + 1]为a = 0和a + 1 = 1,和description_list [0] = 0和description_list [1] = 15.在这些行之间,if语句搜索搜索词,如果找到一个,它会将description_list [a]保存到start_position_list和description_list [a + 1]中stop_position_list,稍后将使用。
因此,您可以想象一个像'ATCG'这样的简单术语会经常发生,这意味着start_position_list和stop_position_list会有很多重复项,这些副本将使用list(set(start_position_list))
删除,然后对它们进行排序。这样,start_position_list [0]和start_position_list [0]将为0和15,如下所示:http://imgur.com/QcOsuhM,然后可以将其用作打印行以显示序列的范围。
现在,当然,最大的问题是第15行,for i in range(description_list[a], description_list[a+1]):
最终会达到[a + 1],而它已经处于description_list的最大长度,因此会给出列表索引超出范围的错误,正如你在这里看到的那样:http://imgur.com/hi7d4tr
最佳解决方案是什么?仍然有必要通过所有的描述线,我不能想出一个更好的结构来完成它们所有?
file = open("IRC_representative_cdna.fa")
file_list = list(file)
search_term = input("Enter your search term: ")
description_list = []
start_position_list = []
stop_position_list = []
for x in range (0, len(file_list)):
if ">" in file_list[x]:
description_list.append(x)
for a in range(0, len(description_list)):
for i in range(description_list[a], description_list[a+1]):
if search_term in file_list[i]:
start_position_list.append(description_list[a])
stop_position_list.append(description_list[a+1])
答案 0 :(得分:2)
避免下标超出范围错误的方法是缩短循环。替换
行for a in range(0, len(description_list)):
通过
for a in range(0, len(description_list)-1):
另外,我认为您可以使用列表推导来构建description_list
:
description_list = [x for x in file_list if x.startswith('>')]
除了缩短之外,它更有效率,因为当只有起始字符相关时,它不会对整行进行线性搜索。
答案 1 :(得分:1)
这是一个使用biopython包的解决方案,因此您可以省去自己解析交错的fasta的麻烦:
from Bio import SeqIO
file = open("IRC_representative_cdna.fa")
search_term = input("Enter your search term: ")
for record in SeqIO.parse(file, "fasta"):
rec_seq = record.seq
if search_term in rec-seq:
print(record.id)
print(rec-seq)
我不清楚你想要的输出是什么,但是这个代码可以很容易地改变以适应它。