运行此代码时我在做什么错?

时间:2019-04-21 21:28:44

标签: python list fasta

首先,我绝对不是编程专家,也不精通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

2 个答案:

答案 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_: