2016-05-13 48 views
3

次のスクリプトを使用して大きなfastaファイルから特定のfastaシーケンスを抽出したいが、出力は空です。大きなfastaファイルから特定のfastaシーケンスを抽出する

transcripts.txtファイルには、assembly.fastaからselected_transcripts.fastaにエクスポートしたいリスト転写物ID(IDとシーケンスの両方)が含まれています。例えば :

  1. transcripts.txt:
     
    Transcript_00004|5601 
    Transcript_00005|5352
  2. assembly.fasta:>Transcripts_00004|5601
     
    >Transcript_00004|5601 
    GATCTGGCGCTGAGCTGGGTGCTGATCGACCCGGCGTCCGGCCGCTCCGTGAACGCCTCGAGTCGGCGCCCGGTGTGCGTTGACCGGAGATCGCGATCTGGGGAGACCGTCGTGCGGTT 
    >Transcript_00004|5360 
    CGATCTGGCGCTGAGCTGGGTGCTGATCGACCCGGCGTCCGGCCGCTCCGTGAACGCCTCGAGTCGGCGCCCGGTGTGCGTTGACCGGAGATCGCGATCTGGGGAGACCGTCGTGCGGTT 
    

IDは>記号によって先行されます。

assembly.fastaにおける転写産物IDがtranscripts.txtでその書き込みのと同じである場合、私は、assembly.fastaファイルを読み込む必要があり、私はselected_transcripts.fastaで、この転写産物IDとその順序を記述する必要があります。上記の例では、最初のトランスクリプトのみを書く必要があります。

提案がありますか?おかげさまで

from Bio import SeqIO 

my_list = [line.split(',') for line in open("/home/universita/transcripts.txt")] 

fin = open('/home/universita/assembly.fasta', 'r') 
fout = open('/home/universita/selected_transcripts.fasta', 'w') 

for record in SeqIO.parse(fin,'fasta'): 
    for item in my_list: 
     if item == record.id: 
      fout.write(">" + record.id + "\n") 
      fout.write(record.seq + "\n") 

fin.close() 
fout.close() 
+1

https://www.biostars.org/p/68718/ – Pierre

+0

あなたの質問を編集し、 'transcripts.txt'と' assembly.fasta'の一部を含めることができますか?データを扱うには? – MattDMo

+0

各コロンの後にトランスクリプト行を分割しますが、スペース区切りです。それは目的ですか? –

答えて

1

あなたの例に基づいて、いくつかの小さな問題があります。これは何が得られないのかを説明します。あなたのtranscripts.txtは、1行に複数のエントリを持っている、assembly.fastaあれば、あなたの最初の項目はまた

['Transcript_00004|5601', 'Transcript_00005|5352']

になりますので、そのためmy_listは、あなたが線でmy_listを反復あなたのループでは、my_line[0]にfirst_lineのすべてのアイテムを持っていますヘッダー行に>がない場合は、IDとシーケンスを含むレコードは返されません。 >をヘッダーに追加し、split関数がスペースを使用し、コロンを使用していないと仮定すると、次のコードではこれらの問題を処理する必要があります。すべてのIDが別途my_listに追加されるように、転写産物の

from Bio import SeqIO 

my_list = [] 
with open("transcripts.txt") as transcripts: 
    for line in transcripts: 
     my_list.extend(line.split(' ')) 

fin = open('assembly.fasta', 'r') 
fout = open('selected_transcripts.fasta', 'w') 

for record in SeqIO.parse(fin,'fasta'): 
    for item in my_list: 
     if item.strip() == record.id: 
      fout.write(">" + record.id + "\n") 
      fout.write(record.seq + "\n") 


fin.close() 
fout.close() 

読書を変更しました。 record.idと比較すると、文字列に改行が入っていないように、各項目の空白が削除されます。

関連する問題