首先,我绝对不是编程专家,也不精通python,所以如果这是一个愚蠢的问题,请原谅我。我正在尝试运行下面的代码,以将“ fasta”文件过滤为仅使用“ ID”文件所需的序列,但是每次运行它时,都会出现错误。任何帮助将不胜感激!
"""
%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
答案 0 :(得分:1)
仅当您在运行程序时未将预期数量的参数传递给程序时,才会发生您描述的异常。 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])]
#...
答案 1 :(得分:0)
我希望它可以为您提供帮助
with open (sys.argv[2]) as file_:
for line in file_: