1

2つのファイルがあります。

ファイル1:次の例のようにフォーマットされた遺伝子配列を含むFASTAファイル:

>PITG_00002 | Phytophthora infestans T30-4 conserved hypothetical protein (426 nt)
ATGCATCGCTCGGGTTCCGCACGGAAAGCCCAAGGTCTGGGATTACGGGGTGGTGGTCGG
TTACACTTGGAATAACCTCGCAAATTCAGAATCTCTACAGGCTACGTTCGCGGATGGAAC
>PITG_00003 | Phytophthora infestans T30-4 protein kinase (297 nt)
ATGACGGCTGGGGTCGGTACGCCCTACTGGATCGCACCGGAGATTCTTGAAGGCAAACGG
TACACTGAGCAAGCGGATATTTACTCGTTCGGAGTGGTTTTATCCGAGCTGGACACGTGC
AAGATGCCGTTCTCTGACGTCGTTACGGCAGAGGGAAAGAAACCCAAACCAGTTCAGATC
>PITG_00004 | Phytophthora infestans T30-4 protein kinase, putative (1969 nt)
ATGCGCGTGTCTGGTCTCCTTTCAATTCTTGCAGCCACTTTGACCACGGCCCAAGACTAC

ファイル2:遺伝子のアクセッションIDだけを含む単純なテキストファイル。そのようです。

PITG_00003
PITG_00005
PITG_00023

ファイル2のすべてのエントリはファイル1のどこかにありますが、ファイル1のすべてのエントリがファイル2にあるわけではありません。ファイル2にないすべてのエントリをファイル1から削除する必要があります。私を助けることができるモジュール、私はただ何を知らない。たとえば、もともとSeqIO.parseこの関数を使用してFASTAファイルからアクセッションだけを抽出できると思っていましたが、これでは実際にはアクセッション番号の2つのファイルが表示されます。他のファイルにあるアクセッションを選択的に抽出する方法がわかりません。たぶん、ファイル2のすべてのエントリを辞書に読み込んでから、そのエントリをファイル1の一致するエントリに関連付けて、SeqIO.parseシーケンス全体を抽出するために使用するようなものです...しかし、私は本当に知りません....誰かが与えることができる助けはありません私は非常に感謝しています!

4

1 に答える 1

6

これを試して:

f2 = open('accessionids.txt','r')
f1 = open('fasta.txt','r')
f3 = open('fasta_parsed.txt','w')

AI_DICT = {}
for line in f2:
    AI_DICT[line[:-1]] = 1

skip = 0
for line in f1:
    if line[0] == '>':
        _splitline = line.split('|')
        accessorIDWithArrow = _splitline[0]
        accessorID = accessorIDWithArrow[1:-1]
        # print accessorID
        if accessorID in AI_DICT:
            f3.write(line)
            skip = 0
        else:
            skip = 1
    else:
        if not skip:
            f3.write(line)

f1.close()
f2.close()
f3.close()

ここで何が起こっているのかを簡単に説明すると...accessionids.txtファイル2ですが、fasta.txtファイル1です。明らかに、これらのファイル名をコード内の実際のファイル名に置き換える必要があります。

まず、辞書(ハッシュまたは連想配列と呼ばれることもあります)を作成し、ファイル2のすべてのアクセッションIDに対して、キーがアクセッションIDであり、が1に設定されているエントリを作成します(値が実際に重要であるというわけではありません)。この場合)。

次に、ファイル1を調べて、そのファイルの各行をもう一度調べます。ファイルの行がで始まる場合>、アクセッションIDが含まれていることがわかります。|アクセッションIDを持つすべての行の文字列にが含まれるため、その行を取得して分割し|ます。次に、で指定された分割の最初の部分を取ります_splitline[0]accessorIDWithArrow[1:-1]文字列の最初と最後の文字を切り落とすために使用します。これは>、前部の記号と後部の空白スペースです。

この時点で、ファイル2accessorIDに期待される形式のアクセッションIDが含まれています。

次に、以前に作成して入力した辞書に、このアクセッションIDがキーとして定義されているかどうかを確認します。含まれている場合は、すぐにアクセッションIDの行を新しいファイルに書き込み、'flag'変数をにfasta_parsed.txt設定/リセットします。セグメントを含むステートメントにより、ファイルに出力されることがわかったアクセッションIDに関連付けられた後続の行が許可されます。skip0elseif not skipfasta_parsed.txt

辞書にない(ファイル2にない)ファイル1のアクセッションIDの場合、行を書き込まず、フラグを0に設定します。したがって、ファイル2に存在するファイル1に別のアクセッションIDが見つかるまで、後続のすべての行はスキップされます。fasta_parsed.txtskip

于 2013-03-12T02:48:22.450 に答える