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

问题描述 投票:-1回答:2

首先,我绝不是一个编程专家,并且我不熟悉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
python list fasta
2个回答
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])]
#...

0
投票

我希望它可以帮助你 with open (sys.argv[2]) as file_: for line in file_:

© www.soinside.com 2019 - 2024. All rights reserved.