2016-09-13 14 views
0

GenBank에서 GI 번호를 단계적으로 제거하고 다음 형식으로 헤더를 편집 한 위치에 여러 개의 fasta 파일이 저장된다는 경고가 계속 표시됩니다.파이썬에서 fasta 헤더의 해당 GI 번호에서 NCBI의 Accession 번호 받기

>SomeText_ginumber 

나는 다음과 같이 심지어 헤더 파일을이로 시작하지만 방법이 이상적으로 파이썬 함께, 내가 NCBI에서 각 GI에 해당하는 가입 번호를 얻을 수 있음을 출력 할 생각도 없어 :

>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에서 데이터를 가져 와서 이전 헤더를 인쇄하지만 액세스 번호와 나머지 입력 시퀀스를 완료하면 완료 :)

This 귀하의 두 가지 예를 위해 일하지만 더 많은 데이터 (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는 검색 문자열의 오른쪽에서 첫 번째 항목 (즉, 마지막 항목)을 찾습니다. 모든 헤더의 형식이 동일한 경우 모든 파일을 반복하고 새 파일에 새 헤더를 쓸 수 있습니다. 당신의 정규식 접근법은 또한 작동 할 수 있지만 나는 오진 (false positive) 여부를 먼저 검사 할 것입니다. 또한 오류를 피하고 잘못된 가입 번호를 지정하려면 레코드 수가 정확히 1인지 확인해야합니다. –

+0

정말 대단합니다. 고마워요. 원래 게시물을 제안하고 업데이트 한 내용을 수정했습니다. 나는 지금 좋은 스크립트를 가지고있다! 마지막으로 한 가지 문제는 헤더 번호에 상관없이 gi 번호를 가입 번호로 대체하는 방법이 있습니까? 현재 GI 번호가 예를 들어 머리글의 시작 부분에있는 경우 여전히 행의 끝에 액자를 넣고 마지막 '_'이후에 있었던 항목을 제거합니다. – wl284