Python 搜索FASTA文件时索引超出范围的解决方法
我正在开发一个程序,让用户输入他们想在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”这样的简单术语经常出现,这意味着开始位置列表和停止位置列表将有大量重复项,这些重复项将使用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和描述列
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文件带来的所有麻烦的理想方法。