-1

プログラムに実行してもらいたいのは、特定のバーコードに関連するシーケンスを取得し、定義された機能を実行することです (シーケンスの平均長と標準偏差から、同じバーコードで識別されるバーコードと無関係な txt を差し引いたもの)。私は似たようなものを書いて、似たようなプログラムに基づいていますが、インデックスエラーが発生し続けます。最初のバーコードを持つすべてのシーケンスは、barcodeCounter = 0 として処理され、2 番目のバーコードは、barcodeCounter = 1 などとして処理されるという考えです。

入力:

import sys
import math

def avsterr(x):
        ave = sum(x)/len(x)
        ssq = 0.0
        for y in x:
                ssq += (y-ave)*(y-ave)
        var = ssq / (len(x)-1)
        sdev = math.sqrt(var)
        stderr = sdev / math.sqrt(len(x))

        return (ave,stderr)

barcode = sys.argv[1]
sequence = sys.argv[2]
lengths = []
toprocess = []
b = open(barcode,"r")
barcodeCounter = 0
for barcode in b:
        barcodeCounter = barcodeCounter + 1
        barcode = barcode.strip()
        print "barcode: %s" %  barcode
        handle = open(sequence, "r")
        for line in handle:
                print line
                seq = line.split(' ',1)[-1].strip()
                print "seq: %s" % seq
                potential_barcode = seq[0:len(barcode)]
                print "something"
                if potential_barcode == barcode:
                        print "Checking sequences"
                        outseq = seq.replace(potential_barcode, "", 1)
                        outseq_length = [len(outseq)]
#                       toprocess.append("")
#                       toprocess[barcodeCounter] += outseq.strip
                        toprocess[barcodeCounter].extend(outseq.strip)   #IndexError/line40
#                       toprocess[barcodeCounter] = toprocess[barcodeCounter] + outseq.strip
                        print "outseq: %s" % outseq
                        print "Barcodes to be processed: %s" % toprocess[barcodeCounter]
                        print "BC: %i" % barcodeCounter
        handle.close()
b.close()
one = len(toprocess[0])
#two = lengths[2]
#three = lengths[3]
print one
#(av,st) = avsterr(lengths)
#print "%f +/- %f" % (av,st)

出力:

barcode: ATTAG
S01 ATTAGAAAAAAA

seq: ATTAGAAAAAAA
something
Checking sequences
Traceback (most recent call last):
  File "./FinalProject.py", line 40, in <module>
    toprocess[barcodeCounter].extend(outseq.strip)
IndexError: list index out of range

これは私がベースにしているコードです。

sequenceCounter = -1
for line in handle:
        if line[0] == ">":
                sequenceCounter = sequenceCounter + 1
#               print "seqid %s\n" % line
                seqidList.append(line)
                seqList.append("")
        if line[0] != ">":
                seqList[sequenceCounter] = seqList[sequenceCounter] + line.strip()

編集: enumerate 関数を追加し、barcodeCounter をコメントアウトしました。

barcode = sys.argv[1]
sequence = sys.argv[2]
lengths = []
toprocess = []
b = open(barcode,"r")
#barcodeCounter = -1
for barcodeCounter, barcode in enumerate(b):
#       barcodeCounter = barcodeCounter + 1
        barcode = barcode.strip()
        print "barcode: %s" %  barcode
        handle = open(sequence, "r")
        for line in handle:
                print line
                seq = line.split(' ',1)[-1].strip()
                print "seq: %s" % seq
                potential_barcode = seq[0:len(barcode)]
                print "something"
                if potential_barcode == barcode:
                        print "Checking sequences"
                        outseq = seq.replace(potential_barcode, "", 1)
                        outseq_length = [len(outseq)]
                        toprocess.append("")
#                       toprocess[barcodeCounter] += outseq.strip
                        toprocess[barcodeCounter].append(outseq.strip) #AttributeError line 40
#                       toprocess[barcodeCounter] = toprocess[barcodeCounter] + outseq.strip
                        print "outseq: %s" % outseq
                        print "Barcodes to be processed: %s" % toprocess[barcodeCounter]
                        print "BC: %i" % barcodeCounter
        handle.close()
b.close()

新しいエラー:

barcode: ATTAG
S01 ATTAGAAAAAAA

seq: ATTAGAAAAAAA
something
Checking sequences
Traceback (most recent call last):
  File "./FinalProject.py", line 40, in <module>
    toprocess[barcodeCounter].append(outseq.strip)
AttributeError: 'str' object has no attribute 'append'

問題のないコード:

barcode = sys.argv[1]
sequence = sys.argv[2]
lengths = []
toprocess = []
b = open(barcode,"r")
#barcodeCounter = -1
for barcodeCounter, barcode in enumerate(b):
#       barcodeCounter = barcodeCounter + 1
        barcode = barcode.strip()
        print "barcode: \n%s\n" %  barcode
        handle = open(sequence, "r")
        for line in handle:
                print line
                seq = line.split(' ',1)[-1].strip()
                print "seq: %s" % seq
                potential_barcode = seq[0:len(barcode)]
#               print "something"
                if potential_barcode == barcode:
                        print "Checking sequences"
                        outseq = seq.replace(potential_barcode, "", 1)
                        outseq_length = [len(outseq)]
                        toprocess.append("")
                        toprocess[barcodeCounter] = toprocess[barcodeCounter] + outseq

@abarnert 役に立ちました、ありがとう。プログラミングに関しては、ときどき(ほとんどの場合)、私は最も賢いわけではありません。新しいシーケンスを追加する方法も変更する必要がstrありlistました。

4

2 に答える 2

0

ここで実際に 2 つの問題があります。


まず、0 ではなく 1 から数えます。 から始めbarcodeCounter0、使用する前にインクリメントします。toprocess[1]これは、たとえば 3 つのバーコードがある場合、 、次にtoprocess[2]、次にを設定しようとしていtoprocess[3]て、最後のバーコードが になることを意味しIndexErrorます。

この問題を回避するためでsequenceCounter = -1はなく、ベースにしたコードが で始まることに注意してください。0

ただし、この問題にはさらに簡単な解決策がありenumerateます。

for barcodeCounter, barcode in enumerate(b):

-1、0、または 1 から開始するか、どこでインクリメントするか、またはそのいずれかを覚えておく必要はありません。0、1、2 などの数字を自動的に取得するだけlen(b)-1です。


第 2 に、正しく数えたとしても、toprocessは と同じサイズではありませんb。実際、それtoprocess[anything]は完全に空であるため、常に例外が発生します。

の末尾に新しい値を追加するには、次のメソッドlistを呼び出します。append

toprocess.append(…)

繰り返しますが、基にしているコードは常に aseqList.append("")を実行する前にa を実行することに注意してくださいseqList[sequenceCounter] =。(これは少しトリッキーなことに注意してください。 をappendインクリメントする場合もあれば、どちらも行わず、の前の値を使用してsequenceCounter代入する場合もあります。) 同等のことを行う必要があります。seqList[sequenceCounter]sequenceCounter

于 2015-04-27T07:17:43.963 に答える