1

テキストファイルに 4 行のブロックを定義し、ブロックの 2 行目が 1 種類の文字のみで構成されている場合にブロックを出力するために、次のコードを作成しました。2行目は常に36文字の文字列で構成されていると想定されています(および以前に検証されています)。

# filter out homogeneous reads

import sys
import collections
from collections import Counter

filename1 = sys.argv[1] # file to process

with open(filename1,'r') as input_file:
    for line1 in input_file:
        line2, line3, line4 = [next(input_file) for line in xrange(3)]
        c = Counter(line2).values() # count characters in line2
        c.sort(reverse=True) # sort values in descending order
        if c[0] < 36:
            print line1 + line2 + line3 + line4.rstrip()

ただし、次のように StopIteration エラーが発生します。誰かが理由を教えていただければ幸いです。

$ python code.py test.file > testout.file
Traceback (most recent call last):
  File "code.py", line 11, in <module>
    line2, line3, line4 = [next(input_file) for line in xrange(3)]
StopIteration

特に、特定のコードの何が問題で、どのように修正するかを説明するような助けをいただければ幸いです。入力の例を次に示します。

@1:1:1323:1032:Y
AGCAGCATTGTACAGGGCTATCATGGAATTCTCGGG
+1:1:1323:1032:Y
HHHBHHBHBHGBGGGH8HHHGGGGFHBHHHHBHHHH
@1:1:1610:1033:Y
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+1:1:1610:1033:Y
HHEHHHHHHHHHHHBGGD>GGD@G8GGGGDHBHH4C
@1:1:1679:1032:Y
CGGTGGATCACTCGGCTCGTGCGTCGATGAAGAACG
4

3 に答える 3

1

あなたは行を持っているので、何度10も繰り返すことができますが、行が不足しています。これは、Python が十分な行とスローを読み取ることができない場所です。22StopIteration

このコードを確認してください。少し更新しました。

import sys
import collections
from collections import Counter

filename1 = sys.argv[1] # file to process

with open(filename1,'r') as input_file:
    while True:
        try:
            line1, line2, line3, line4 = [next(input_file) for line in xrange(4)]
        except StopIteration:
            print "Not enough lines to read!"
            break

        c = Counter(line2).values() # count characters in line2
        c.sort(reverse=True) # sort values in descending order
        if c[0] < 36:
            print line1 + line2 + line3 + line4.rstrip()
        else:
            print "Skipping 4 lines since less than 36 characters"
于 2015-12-23T11:22:34.980 に答える
1

ファイル内の行数を割り切れない場合、これが得られます4。次に、存在しない行を読み取ろうとします。空行を数える必要があります。

解決策の 1 つは、処理に十分な行数がない場合にファイルの処理を停止することです。

try:
    line2, line3, line4 = [next(input_file) for line in xrange(3)]
except StopIteration:
    break

これは少しきれいに感じます:

while True:
    try:
        line1, line2, line3, line4 = [next(input_file) for line in xrange(4)]
except StopIteration:
    break

イテレータを 2 か所ではなく 1 か所でしか進めないためです。

于 2015-12-23T11:13:01.940 に答える