2016-09-13 6 views
0

GenBankでGI番号を段階的に削除していて、次の形式でヘッダーを編集した場所にいくつかのfastaファイルが保存されています。Pythonのfastaヘッダーの対応するGI番号からNCBIのアクセッション番号を取得

>SomeText_ginumber 

次のように私はNCBIおよび出力から各GIのためのヘッダーを持つファイルを、対応するアクセッション番号を取得することができることを、理想的にはPythonで、私もこれで始めるには考えてきませんが、方法があります:

>SomeText_accessionnumber 

別のexaファイル形式のmple:

>Desulfovibrio_fructosivorans_ferredoxin_492837709 
MTKSVAPTVTIDGKVVPIEGERNLLELIRKVRIDLPTFCYHSELSVYGACRLCLVEVKNRGIMGAC 
>Oxalobacteraceae_bacterium_AB_14_hypothetical_protein_522195384 
MIKLTVNGIPVEVDEGATYLDAANKAGVHIPTLCYHPRFRSHAVCRMCLVHVAGSSRPQAACIGKA 

編集/更新:

from Bio import Entrez 
from time import sleep 
import sys 
import re 
Entrez.email = '' 

seqs = open(sys.argv[1],"r") 

for line in seqs: 
    if line.startswith('>'): 
     gi = re.findall("\d{5,}",line) 
     matches = len(gi) 
     #print(matches) 
     if matches < 2: 
      if gi: 
       handle = Entrez.efetch(db="nucleotide", id=gi, retmode="xml") 
       records = Entrez.read(handle) 
       print(line[0:line.rfind('_') + 1] + records[0]['GBSeq_primary-accession']) 
       sleep(1) 
     elif matches >= 2: 
      print("Error - More than one ginumber in header!") 
      break 
     else: 
      seq=line.rstrip() 
      print(seq) 
    else: 
     seq1=line.rstrip() 
     print(seq1) 

答えて

1

BioPythonを使用してみてください。

次のスニペットを開始する必要があります。まずヘッダー(アンダースコアの後のヘッダーの部分)からGIを取得し、GenBankからデータを取得し、古いヘッダーを印刷しますが、アクセッション番号と残りの入力シーケンスを印刷します:)

これはあなたの2つの例では動作しますが、おそらく多くのデータ(GIがないなど)で失敗します。受託番号にはアンダースコアが付いています。ヘッダーと同じように、後で解析するのは難しくなります。恐らく、アンダースコアを何か他のものに置き換えるか、別のセパレータを追加してください。

from Bio import Entrez 
from time import sleep 
Entrez.email = '[email protected]' 

seqs = """>Desulfovibrio_fructosivorans_ferredoxin_492837709 
MTKSVAPTVTIDGKVVPIEGERNLLELIRKVRIDLPTFCYHSELSVYGACRLCLVEVKNRGIMGAC 
>Oxalobacteraceae_bacterium_AB_14_hypothetical_protein_522195384 
MIKLTVNGIPVEVDEGATYLDAANKAGVHIPTLCYHPRFRSHAVCRMCLVHVAGSSRPQAACIGKA""" 


for line in seqs.splitlines(): 
    if line.startswith('>'): 
     gi = line[line.rfind('_') + 1:] 
     handle = Entrez.efetch(db="nucleotide", id=gi, retmode="xml") 
     records = Entrez.read(handle) 
     print(line[0:line.rfind('_') + 1] + records[0]['GBSeq_primary-accession']) 
     sleep(1) 
    else: 
     print(line) 
+0

本当に役に立ちました。私はちょうどちょうどこれがたくさんの助けになるように、カンマで区切られたgi番号のリストからアクセッションを取り出す方法を研究しました。 私は正規表現を使用してジムマーを得ることを考えていました。 '[0-9] {4、}'それから、ギンナムのないfastaのエントリがあったかどうかは関係ありませんか? 私は[line.rfind( '_')+ 1:]が '_'の最後のインスタンスの後の文字列をとっていると思いますか? – wl284

+0

あなたは間違いなしです。 rfindは、検索文字列の右から最初に出現するもの、すなわち最後の出現を検索します。 ヘッダーの形式がすべて同じ場合は、すべてのファイルをループして新しいヘッダーを新しいファイルに書き込むことができます。あなたの正規表現のアプローチもうまくいくかもしれませんが、私が最初に偽陽性を確認するでしょう。また、レコードの数が正確に1であるかどうかをチェックすることは、エラーを回避し、誤ったアクセッション番号を割り当てるために必須である。 –

+0

それは素晴らしいです、ありがとう。元の投稿を提案して更新しました。私は今、素敵な便利なスクリプトを持っています! 最終的な問題は、ヘッダーのどこにあっても、GI番号を登録番号に置き換える方法はありますか?現在のところ、GI番号がヘッダの先頭にある場合は、それでも行頭にアクセス権を置き、最後の '_'の後にあったものを削除します。 – wl284

関連する問題