0

私はPythonにかなり慣れていないので、forループに問題があり、まったく理解できないようです。

次のサンプル テキストを含む FASTA ファイルを読み込もうとしています。

>seq1
AAACTACCGCGTTT
>seq2
AAACTGCAACTAGCGTTT
>seq3
AAACCGGAGTTACCTAGCGTTT

私がやりたいことは、自分のファイルを読み込んで FASTA ヘッダー (例: ヘッダーが >seq1) を出力することです。次に、DNA シーケンスに存在する 2 つの一意のパターン (この例では "AAA" と "TTT") を照合し、これら 2 つのパターンの間にある DNA 配列を出力します。

したがって、私の出力は次のようになります。

>seq1
CTACCGCG
>seq2
CTGCAACTAGCG
>seq3
CCGGAGTTACCTAGCG

次のコードがあります。

import re
def find_seq(filename):
    with open(filename) as file:
       seq=''
       for line in file:
            header = re.search(r'^>\w+', line)
            if(header):
                print (header.group())
                seq = seq.replace('\n','')
                find_Lpattern = re.sub(r'.*AAA', '',seq)
                find_Rpattern = re.sub(r'TTT.*', '',find_Lpattern)
                if(find_Rpattern):
                    print (find_Rpattern)
                    seq = ''
                else:
                    seq += line
filename = 'test.txt'
print(find_seq(filename))

私はこれを出力として取得し続けます:

>seq1
>seq2
CTACCGCG
>seq3
CTGCAACTAGCG

基本的に、私の for ループは seq1 をスキップしてから、seq1 から seq2 に DNA シーケンスを割り当てます。私の for ループの反復はオフです。この問題を解決できるように、誰かが私を正しい方向に向けてもらえますか?

4

1 に答える 1

2

説明した結果が得られるようにインデントが設定されていると仮定しても、ロジックはオフです。蓄積されたを処理する前に、ヘッダーを印刷していますseq

ファイルの 1 行目を読むと、header正規表現が一致します。その時点で、seqは空の文字列です。re.subしたがって、一致を出力し、空の文字列に対して置換と呼び出しを実行します。

次に、2 行目の「AAACTACCGCGTTT」を読み取り、それを に追加しseqます。

次に、3 行目の ">seq2" を読み取ります。これはヘッダーの正規表現と一致するため、ヘッダーが出力されます。次に、replace と sub の呼び出しを実行します。seqこれは、2 行目の「AAACTACCGCGTTT」のままです。

seqヘッダーを印刷する前に処理を移動する必要があります。また、最終ヘッダーを見つけずにファイルの終わりを実行した場合に何が起こるかを検討する必要があります。 for ループが終了しました。

SeqIOまたは、 FASTA ファイルを解析するためのモジュールを備えたサードパーティの biopattern ライブラリを調べてください。

于 2013-11-11T22:15:29.073 に答える