0

私は以前、このコードを使い始めようとして、この質問をしました: コマンド ライン パラメータは 2 または 3 パラメータを取る必要があります

-s: これはオプションのパラメーターまたはスイッチであり、ユーザーがスプライシングされた遺伝子配列 (イントロンが除去されている) を望んでいることを示します。ユーザーはこれを提供する必要はありません (つまり、遺伝子配列全体が必要です)。提供する場合は、最初のパラメーターにする必要があります。

入力ファイル (遺伝子を含む)

出力ファイル (プログラムが fasta ファイルを保存するために作成する場所)

ファイルには次のような行が含まれています。

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

次に、入力されたすべてが正しいことを確認するために複数の条件を作成する必要がありました。そうしないと、プログラムが終了してしまいます。

  • ユーザーは、.genes で終わらない入力ファイル名を指定します
  • ユーザーは、.fa または .fasta で終わらない出力名を指定します。
  • ユーザーが 2 つ未満または 3 つを超えるパラメーターを指定した場合
  • ユーザーの最初のパラメーターはダッシュで始まりますが、「-s」ではありません
  • 入力ファイルが次のいずれかに違反しています:

    • 最初の行は「#」記号で開始する必要があります
    • 各行にはちょうど 10 列 (列は 1 つ以上のスペースで区切られている) が必要です。
    • 列 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)
4

1 に答える 1

-1

このブロックを削除します:

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

sys.argv[1]argv に存在する'-s'場合、数行前に削除したため、常に とは等しくありません。'-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] の値をリテラル'\t\d+' 文字列と比較します。reモジュールについて学びたいと思うかもしれません。次のif行でも同じ問題。

于 2012-04-21T19:48:56.763 に答える