搜索FASTA文件

时间:2015-12-12 12:06:44

标签: python for-loop nested-loops fasta

我正在开发一个程序,让用户输入他们想要在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])

2 个答案:

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

我不清楚你想要的输出是什么,但是这个代码可以很容易地改变以适应它。