2012-12-07 2 views
2

BioPython Entrez 모듈을 사용하여 this post 행의 genbank 파일 목록을 다운로드했습니다. 이후 Entrez에서 다운로드 한 genbank 파일은 게놈이 완전하지 않은 유기체에 제공된 잠정적 인 RefSeq의 일부이기 때문에 이러한 파일을 구문 분석하면 오류가 발생합니다 (NZ_CM000913.1). 이 파일을 읽으려고하면 레코드 오류가 발생하고 스크립트가 중지됩니다. 이러한 레코드를 피할 수있는 함수를 작성하려고합니다. 가장 간단한 방법은 크기별로 레코드를 필터링하는 것이지만, 파일을 레코드가 포함되어 있는지 확인한 다음 그렇지 않은 경우 제외하는 방법을 통해 '생물 - 파이썬 적으로'더 많은 작업을 수행하는 방법에 대해 궁금합니다. 현재 ValueError 메시지가 발생하지만 스크립트가 중지됩니다.생물 뱅크에서 Genbank 파일 구문 분석 오류가 발생했습니다.

#the error message is something like this  
from Bio import SeqIO 
gbkfile = 'NZ_CM000913.1' 
SeqIO.read(open(gbkfile), 'gb') 

     File "/usr/lib64/python2.6/site-packages/Bio/SeqIO/__init__.py", line 605, in read 
     raise ValueError("No records found in handle") 

내 루프를 들어 I는 다음과 같이 사용할 수 있습니다

#filter by length 
for gbk in gbklist: 
    if len(open(gbk).readlines()) < 50: 
     print 'short file: exclude' 
    else: 
     process_gbk(gbk) 

을하지만 바이오 파이썬 내에서 오류 메시지를 잡을 수 있을지 궁금 :

#generate GBK-file exception  
for gbk in gbklist: 
    try: 
     SeqIO.read(open(gbk),'gb') 
     process_gbk(gbk) 
    except BiopythonIO: 
     'this file is not a genbank file' 
     pass 
+0

가장 간단한 방법은 ValueError를 잡는 것입니다. 다르게 처리해야하는 다른 유형의 ValueError가있을 것으로 예상하지 않는 한 의미가 있습니다. 보다 견고한 솔루션은 SeqIO를 확장하고 "핸들에서 레코드를 찾을 수 없습니다"라는 메서드를 겹쳐 쓰는 것입니다. 그러면 하위 클래스 오류가 발생하고 다운 스트림을 잡을 수 있습니다. 파일 길이를 검사하는 것이 더 나은지 여부는 SeqIO 읽기 방식의 모듈 방식에 달려 있습니다 ... – Karmel

답변

2

제안 사항이 거의 있습니다. 끝내기 위해 몇 가지 편리한 특전이 있습니다 (논평 읽기)

errorList = []        # to store your erroneous files for later handling ;) 

#generate GBK-file exception 
for gbk in gbklist: 
    try: 
     SeqIO.read(open(gbk),'gb') 
     process_gbk(gbk) 
    except ValueError:      # handles your ValueError 
     print(gbk+' is not a genbank file') # lets you know the file causing the error "live" 
     errorList.append(gbk)    # logs the name of erroneous files in "errorList" 
     continue        # skips straight to the next loop  
+0

@zach 저는 Python뿐 아니라 MATLAB에서도 이러한 유형의 데이터를 사용하여 비슷한 작업을 수행했는지 묻습니다. 질문 :) –

2

을 내가 NZ_CM000913.1을 열 수 있습니다 실제로 Biopython을 사용하면됩니다.

>>> from Bio import SeqIO 
>>> fname = 'NZ_CM000913.1.gbk' 
>>> recs = SeqIO.read(fname, 'genbank') 
>>> recs 
SeqRecord(seq=UnknownSeq(6760392, alphabet = IUPACAmbiguousDNA(), character = 'N'), id='NZ_CM000913.1', name='NZ_CM000913', description='Streptomyces clavuligerus ATCC 27064 chromosome, whole genome shotgun sequence.', dbxrefs=['Project:47867 BioProject:PRJNA47867']) 

빈 파일이 아닌 파일을 올바르게 다운로드 했습니까?

또한 open('NZ_CM000913.1.gbk') 번을 SeqIO.read 번으로 보내고 있습니다. 파일 핸들을 남겨 두지 않으려면 파일 이름 (SeqIO.read('NZ_CM000913.1.gbk', 'genbank'))을 제공하는 것이 더 낫고 (읽기가 더 쉽습니다).

관련 문제