Python 搜索FASTA文件时索引超出范围的解决方法

Python 搜索FASTA文件时索引超出范围的解决方法,python,for-loop,nested-loops,fasta,Python,For Loop,Nested Loops,Fasta,我正在开发一个程序,让用户输入他们想在FASTA文件中找到的序列,然后程序显示描述行和属于它的序列。 FASTA位于,大约87 MB 其思想是首先创建一个包含描述行位置的列表,该列表始终以>开头。一旦您知道什么是描述行,就可以在两个描述行之间的行中搜索搜索项。这正是第四段中所做的,这导致了一个48425长的列表,下面是一个关于结果的想法: 现在第五段是在两个描述行之间搜索,让我们以第0行和第15行为例,这将是描述列表[a]和描述列表[a+1],分别为a=0和a+1=1,描述列表[0]=0和描述列

我正在开发一个程序,让用户输入他们想在FASTA文件中找到的序列,然后程序显示描述行和属于它的序列。 FASTA位于,大约87 MB

其思想是首先创建一个包含描述行位置的列表,该列表始终以>开头。一旦您知道什么是描述行,就可以在两个描述行之间的行中搜索搜索项。这正是第四段中所做的,这导致了一个48425长的列表,下面是一个关于结果的想法:

现在第五段是在两个描述行之间搜索,让我们以第0行和第15行为例,这将是描述列表[a]和描述列表[a+1],分别为a=0和a+1=1,描述列表[0]=0和描述列表[1]=15。在这些行之间,if语句搜索搜索词,如果找到一个,它将把description_list[a]保存到start_position_列表中,把description_list[a+1]保存到stop_position_列表中,稍后将使用它

因此,正如您所想象的,像“ATCG”这样的简单术语经常出现,这意味着开始位置列表和停止位置列表将有大量重复项,这些重复项将使用
list(set(开始位置列表))
删除,然后对它们进行排序。这样,开始位置列表[0]和开始位置列表[0]将分别为0和15,如下所示:,然后可以将其用作打印行以显示序列的范围

当然,现在最大的问题是,第15行,
对于范围内的i(description\u list[a],description\u list[a+1]):
最终会命中[a+1],而它已经达到description\u list的最大长度,因此会给出一个列表索引超出范围的错误,正如您在这里看到的:

什么是最好的解决方案?仍然有必要检查所有的描述行,我不能想出更好的结构来检查它们

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])

避免下标超出范围错误的方法是缩短循环。更换线路

for a in range(0, len(description_list)):

此外,我认为您可以使用列表理解来建立
description\u list

description_list = [x for x in file_list if x.startswith('>')]

除了更短之外,它更有效,因为当只有起始字符相关时,它不会对整行进行线性搜索。

避免下标超出范围错误的方法是缩短循环。更换线路

for a in range(0, len(description_list)):

此外,我认为您可以使用列表理解来建立
description\u list

description_list = [x for x in file_list if x.startswith('>')]

除了更短之外,它还更有效,因为当只有起始字符相关时,它不会对整行进行线性搜索。

这里有一个使用包的解决方案,这样就省去了您自己解析交错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)

我不太清楚您想要的输出是什么,但是可以很容易地更改此代码以适应它。

这里有一个使用该软件包的解决方案,从而省去了您自己解析交错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)

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

有用于解析fasta文件的库有用于解析fasta文件的库谢谢您的评论,回头看,这只是一件小事,但有时很容易忽略错误的确切位置。也谢谢你让我知道列表的理解,我一直在阅读它,它看起来确实是一个更有用的方式!谢谢你的评论,回顾过去,这只是一件小事,但有时很容易忽略错误的具体位置。也谢谢你让我知道列表的理解,我一直在阅读它,它看起来确实是一个更有用的方式!谢谢你的回答!这似乎确实是避免搜索fasta文件带来的所有麻烦的理想方法。谢谢您的回答!这似乎确实是避免搜索fasta文件带来的所有麻烦的理想方法。