首先,我绝不是一个编程专家,并且我不熟悉python,所以请原谅我,如果这是一个愚蠢的问题。我正在尝试运行下面的代码,使用“ID”文件将fasta文件过滤到我想要的序列,但每次运行它时,都会出错。任何帮助是极大的赞赏!
"""
%prog file.fasta wanted_ids.txt
"""
from Bio import SeqIO
import sys
wanted = [line.strip() for line in open(sys.argv[2])]
seqiter = SeqIO.parse(open(sys.argv[1]), 'fasta')
SeqIO.write((seq for seq in seqiter if seq.id in wanted), sys.stdout, "fasta")
这是我得到的错误:
File "filter.py", line 7, in <module>
wanted = [line.strip() for line in open(sys.argv[2])]
IndexError: list index out of range
只有在运行程序时未向程序传递预期数量的参数时,才会出现您描述的异常。 sys.argv
变量包含程序的参数。它将是一个列表,sys.argv[0]
将具有脚本本身的文件名,而后面的值将是后来传入的参数。
您的程序的文档字符串(%prog file.fasta wanted_ids.txt
)表明您希望将两个参数传递给该程序,其中一个是.fasta
文件,另一个是.txt
文件。您省略了其中一个或两个参数,因此程序失败查找sys.argv[2]
,并提出一个IndexError
。
您可能希望在程序中添加代码以检查参数的数量,如果输入的数字错误,则可以提供更有用的异常:
from Bio import SeqIO
import sys
if len(sys.argv) != 3:
sys.exit("Bad arguments! Usage: {} <file.fasta> <wanted_ids.txt>".format(sys.argv[0]))
wanted = [line.strip() for line in open(sys.argv[2])]
#...
我希望它可以帮助你
with open (sys.argv[2]) as file_:
for line in file_: