2017-09-11 26 views
2

私は2つのファイルを比較し、他のもののサブセットを持つシーケンスを抽出しようとしています。そして、私は識別子も抽出したいと思います。しかし、私ができることは、サブセットを含むシーケンスを抽出できることです。サンプルファイルは、次のとおりです。既知のシーケンスでfastaファイルからシーケンスとヘッダを抽出する

text.fa 
>header1 
ETTTHAASCISATTVQEQ*TLFRLLP 
>header2 
SKSPCSDSDY**AAA 
>header3 
SSGAVAAAPTTA 

と、

textref.fa 
>textref.fa 
CISA 
AAAP 
AATP 

私は、コードを実行すると、私はこの出力を持っています:

ETTTHAASCISATTVQEQ*TLFRLLP 
SSGAVAAAPTTA 

しかし、私の予想出力はヘッダである:

>header1 
ETTTHAASCISATTVQEQ*TLFRLLP 
>header3 
SSGAVAAAPTTA 

マイコードは2つです私が持っているtext.faの配列を有する午前、このsequencesmatched.txtで、

def get_nucl(filename): 
    with open(filename,'r') as fd: 
     nucl = [] 
     for line in fd: 
      if line[0]!='>': 
       nucl.append(line.strip()) 
     return nucl 
def finding(filename,reffile): 
     nucl = get_nucl(filename) 
     with open(reffile,'r') as reffile2: 
      for line in reffile2: 
       for element in nucl: 
        if line.strip() in element: 
          yield(element) 



    with open('sequencesmatched.txt','w') as output: 
      results = finding('text.fa','textref.fa',) 
      for res in results: 
       print(res) 
       output.write(res + '\n') 

ので:部品は、最初に私はこれらの配列を持つファイルを作成し、私は、元のFASTAファイルから自分のヘッダーでそれらを抽出しようサブストリングtextref.fa :出力として、私は唯一の最初の試合で一つの配列を取得することができ、

def finding(filename,seqfile): 
     with open(filename,'r') as fastafile: 
       with open(seqfile,'r') as sequf: 
         alls=[] 
         for line in fastafile: 
           alls.append(line.strip()) 
         print(alls) 
         sequfs = [] 
         for line2 in sequf: 
           sequfs.append(line2.strip()) 
           if str(line.strip()) == str(line2.strip()): 
             num = alls.index(line.strip()) 
             print(alls[num-1] + line) 


print(finding('text.fa','sequencesmatched.txt')) 

しかし:

ETTTHAASCISATTVQEQ*TLFRLLP 
SSGAVAAAPTTA 

だから、他の部分では、それぞれのヘッダとこれらの配列を取得します:

>header1 
ETTTHAASCISATTVQEQ*TLFRLLP 

たぶん私は2番目のファイルなしでそれを行うことができますが、私は配列およびそれらのそれぞれのヘッダを取得するには、右のループを作ることができませんでした。したがって、私は遠くに行った..

私はあなたが助けることができれば幸せだろう!

+1

これはエラーです:すべて[num-1]、これはあなたのリストではありませんが、Pythonの機能です。スペルが間違っていましたか? "s"はありません – Bestasttung

+0

@Bestasttungありがとうございます!私は気付きませんでした。今、私はエラーを持っていないが、望ましくない出力を得る。私は質問を編集しています。 – bapors

答えて

1

あなたのファイルが常に同じ構造である場合は、はるかに簡単に何かを行うことができます:

ここ
def get_nucl(filename): 
    with open(filename, 'r') as fd: 
     headers = {} 
     key = '' 
     for line in fd.readlines():  
      if '>' in line: 
       key = line.strip()[1:] # to remove the '>' 
      else: 
       headers[key] = line.strip() 

    return headers 

私はあなたのファイルがあなたには、いくつかのテストを追加する必要がない場合は何でも、「> headern」で始まると仮定しています。今すぐheaders['header1'] = 'ETTTHAASCISATTVQEQ*TLFRLLP'のような辞書があります。

だから今、あなただけでは辞書を使っマッチ見つけること:

def finding(filename, reffile): 
    headers = get_nucl(filename) 
    with open(reffile, 'r') as f: 
     matches = {} 
     for line in f.readlines(): 
      for key, value in headers.items(): 
       if line.stip() in value and key not in matches: 
        matches[key] = value 

    return matches 

あなたはそれらの値に一致するヘッダを持つ辞書を持っているようにあなたは、サブ文字列を持っている場合、あなただけのdictに確認することができ、およびすでにヘッダーの値をキーとして持っています。

ちょうどあなたがprint(finding(....)をやったのを見ましたが、あなたの機能はすでに印刷されています。

+0

あなたのコードをありがとう、しかし、私は出力としてのみ 'なし'を取得しています。 – bapors

+0

はい残念ですが、line.stip()のvalueとkeyが一致しない場合、 '' 'でline.strip() '' '。今はうまく動作します – Bestasttung

+0

ありがとうございます。でも、私はまだ最初のヘッダーと最初のシーケンスしか取得できません。それは私に2番目の試合を見せてくれません.. – bapors

関連する問題