Python条件错误代码错误

时间:2012-04-21 19:09:52

标签: python regex command-line-arguments fasta

我之前曾问过这个问题,试图开始使用这段代码: 命令行参数需要采用2 OR 3参数

-s:这是一个可选参数或开关,表示用户wwants拼接的基因序列(内含子被删除)。用户不必提供这个(意味着他想要整个基因序列),但是他确实提供了它然后它必须是第一个参数

输入文件(带基因)

输出文件(程序将创建存储fasta文件的位置

该文件包含如下行:

NM_001003443 chr11 + 5925152 592608098 2 5925152,5925652,5925404,5926898,

然后我需要制作多个条件以确保输入的所有内容都正确,否则程序将退出:

  • 用户指定不以.genes
  • 结尾的输入文件名
  • 用户指定的输出名称不以.fa或.fasta
  • 结尾
  • 用户提供少于两个或多于三个的参数
  • 用户的第一个参数以短划线开头,但不是'-s'
  • 输入文件违反以下任何内容:

    • 第一行应以“#”符号
    • 开头
    • 每行应该有十列(由一个或多个空格分隔的列)
    • 第2列(从0开始计算)应为+或 - 符号
    • 第8列应该是以制表符分隔的整数列表
    • 第9列应该是以制表符分隔的整数列表,其整数与第8列完全相同。

我已为此编写代码,但其中存在错误。然而,我最近无法找到错误。有人可以帮助我查看我的代码并查看某处是否存在错误?我真的很感激!!

所有if语句都在我的实际代码中被标记,但我在这里导入它时遇到了麻烦......

import sys

p = '(NM_\d+)\s+(chr\d+)([(\+)|(-)])\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+,\d+,)s+(\d+,\d+,)'
e = '([(\+)|(-)])'
def getGenes(spliced, infile, outfile):
spliced = False
if '-s' in sys.argv:
    spliced = True
    sys.argv.remove('s')
    infile, outfile = sys.argv[1:]
if '.genes' not in infile:
    print('Incorrect input file type')
    sys.exit(1)
if '.fa' or '.fasta' not in outfile:
    print('Incorrect output file type')
    sys.exit(1)
if len(sys.argv[0]) < 2 or len(sys.argv[0]) > 3:
    print('Command line parameters missing')
    sys.exit(1)
if sys.argv[1] != '-s':
    print('Invalid parameter, if spliced, must be -s')
    sys.exit(1)
fp = open(infile, 'r')
wp = open(outfile, 'r')
FirstLine = fp.readline().strip()
if not FirstLine.startswith('#'):
    print ('First line does not start with #')
    sys.exit(1)
n = 1
for line in fp.readlines():
    n += 1
    cols = line.strip().split('')
    if len(cols) != 10:
        print('Lenth not equal to 10')
        sys.exit(1)
    if cols[2] != '+' or '-':
        print('Column 2 is not a + or - symbol')
        sys.exit(1)
    if cols[8] != '\t\d+':
        print('Column 8 is not a tab-separated list of integers')
        sys.exit(1)
    if cols[9] != '\t\d+' and len(cols[9]) != len(cols[8]):
        print('Column 9 in not a tab-separated list of integers with the exact same number of integers in column 8')
        sys.exit(1)

1 个答案:

答案 0 :(得分:-1)

删除此块:

if sys.argv[1] != '-s':
    print('Invalid parameter, if spliced, must be -s')
    sys.exit(1)

sys.argv[1]将始终不等于'-s',因为如果argv中存在'-s',您之前会将其删除一些:

if '-s' in sys.argv:
    spliced = True
    sys.argv.remove('s')

和这一行

if len(sys.argv[0]) < 2 or len(sys.argv[0]) > 3:

不检查有用的东西,并且会经常触发。它检查调用脚本的名称长度是否正好是2或3个字符。那没有意义。 看起来你想要检查两个文件名,加上可能的-s标志是否已通过,仅此而已。

在这种情况下,你的意思是:

if not 3 <= len(sys.argv) <= 4: # len(sys.argv) - 1 is the number of parameters for the script, as sys.argv[0] is the scriptname itself

如果您需要更多帮助,您必须更准确地了解观察到的不当行为。

编辑:

if cols[8] != '\t\d+':

不会按照你喜欢的方式运作。它将cols [8]中的值与 literal '\ t \ d +'字符串进行比较。您可能想了解re模块。在下一个if行中出现同样的问题。