2015-12-01 7 views
1

Я хочу загрузить файлы genbank из NCBI с помощью Biopython и списка номеров доступа (обратите внимание, что я вызываю скрипт с адресом электронной почты в качестве аргумента, например, python scriptName.py EMAILADDRESS)socket.gaierror при загрузке файлов genbank w/biopython

 import os 
     import os.path 
     import sys 
     from Bio import Entrez 
     import datetime 
     import time 

     ############################################################################### 
     # Call Entrez to download files 
     # If downloading more than 100 files... 
     # Run this script only between 9pm-5am Monday - Friday EST 
     # Send E-utilities requests to http://eutils.ncbi.nlm.nih.gov 
     # Make no more than 3 requests every 1 second. 
     # Use URL parameter email & tool for distributed software 
     # NCBI's Disclaimer and Copyright notice must be evident to users of your service. 
     # 
     # Use this script at your own risk. 
     # Neither the script author nor author's employers are responsible for consequences arising from improper usage 
     ############################################################################### 
     start_day = datetime.date.today().weekday() # 0 is Monday, 6 is Sunday 
     start_time = datetime.datetime.now().time() 
     accession = ['NC_002695.1', 'NC_002128.1', 'NC_002127.1'] 
     arguments = sys.argv 
     Entrez.email = arguments[1] 

     if ((start_day < 5 and start_time > datetime.time(hour=21)) or (start_day < 5 and start_time < datetime.time(hour=5)) or start_day > 5 or len(accession) <= 100): 
      for a in accession: 
       print(a) 
       if ((datetime.date.today().weekday() < 5 and datetime.datetime.now().time() > datetime.time(hour=21)) or (datetime.date.today().weekday() < 5 and datetime.datetime.now().time() < datetime.time(hour=5)) or (datetime.date.today().weekday() == start_day + 1 and datetime.datetime.now().time() < datetime.time(hour=5)) or (datetime.date.today().weekday() > 5) or len(accession) <= 100): 
        while True: 
         print('Downloading ' + a) 
         #try: 
         handle=Entrez.efetch(db='nucleotide', id=a, rettype='gb', retmode='text') 
         FILENAME = 'GenbankFiles_E_coli/' + a + '.gb' 
         local_file=open(FILENAME,'w') 
         local_file.write(handle.read()) 
         handle.close() 
         local_file.close() 

Когда я запускаю сценарий, он делает частичную загрузку первого файла (только), прежде чем я получаю сообщение об ошибке:

NC_002128.1 
Downloading NC_002128.1 
Downloading NC_002128.1 
Traceback (most recent call last): 
    File "/usr/local/anaconda3/lib/python3.4/urllib/request.py", line 1182, in do_open 
    h.request(req.get_method(), req.selector, req.data, headers) 
    File "/usr/local/anaconda3/lib/python3.4/http/client.py", line 1088, in request 
    self._send_request(method, url, body, headers) 
    File "/usr/local/anaconda3/lib/python3.4/http/client.py", line 1126, in _send_request 
    self.endheaders(body) 
    File "/usr/local/anaconda3/lib/python3.4/http/client.py", line 1084, in endheaders 
    self._send_output(message_body) 
    File "/usr/local/anaconda3/lib/python3.4/http/client.py", line 922, in _send_output 
    self.send(msg) 
    File "/usr/local/anaconda3/lib/python3.4/http/client.py", line 857, in send 
    self.connect() 
    File "/usr/local/anaconda3/lib/python3.4/http/client.py", line 834, in connect 
    self.timeout, self.source_address) 
    File "/usr/local/anaconda3/lib/python3.4/socket.py", line 494, in create_connection 
    for res in getaddrinfo(host, port, 0, SOCK_STREAM): 
    File "/usr/local/anaconda3/lib/python3.4/socket.py", line 533, in getaddrinfo 
    for res in _socket.getaddrinfo(host, port, family, type, proto, flags): 
socket.gaierror: [Errno -2] Name or service not known 

During handling of the above exception, another exception occurred: 

Traceback (most recent call last): 
    File "download_files.py", line 92, in <module> 
    handle=Entrez.efetch(db='nucleotide', id=a, rettype='gb', retmode='text') 
    File "/usr/local/anaconda3/lib/python3.4/site-packages/Bio/Entrez/__init__.py", line 155, in efetch 
    return _open(cgi, variables, post) 
    File "/usr/local/anaconda3/lib/python3.4/site-packages/Bio/Entrez/__init__.py", line 516, in _open 
    handle = _urlopen(cgi) 
    File "/usr/local/anaconda3/lib/python3.4/urllib/request.py", line 161, in urlopen 
    return opener.open(url, data, timeout) 
    File "/usr/local/anaconda3/lib/python3.4/urllib/request.py", line 463, in open 
    response = self._open(req, data) 
    File "/usr/local/anaconda3/lib/python3.4/urllib/request.py", line 481, in _open 
    '_open', req) 
    File "/usr/local/anaconda3/lib/python3.4/urllib/request.py", line 441, in _call_chain 
    result = func(*args) 
    File "/usr/local/anaconda3/lib/python3.4/urllib/request.py", line 1210, in http_open 
    return self.do_open(http.client.HTTPConnection, req) 
    File "/usr/local/anaconda3/lib/python3.4/urllib/request.py", line 1184, in do_open 
    raise URLError(err) 
urllib.error.URLError: <urlopen error [Errno -2] Name or service not known> 

Я до сих пор, чтобы определить, есть ли ошибка в моем коде, если есть проблема с выбранными мной модулями (хотя Biopyth on должен обрабатывать вызовы), если есть проблема с моим подключением (мои блоки заданий и дроссели без предупреждения), или если это что-то еще.

Я попытался запустить его с и без модулей urllib */http * безрезультатно (я получаю ту же ошибку). Однако частичный файл интересен. Загружается все до конечных последовательностей (с записью contig в конце). Вот последние строки загруженного файла:

/translation="MVPPSAVLCYHNEISRQIPVNMKNIRTEFIPRFNLTLCFPRYWM 
TWTGIGIICVFAMVPPALRDPLLGKLGMLVGRLGKSARQRALINLSLCFPEYSDKEKE 
NIVDAMFATASMAVVLMAELALSGPDKISHRIRWNGLEIVEKMAQNNEKVIFLVPHAW 
GVDIPAMLMAASGRKMAAMFHNQRNPVVDYVWNSVRRRFGGKLHARNDGIASFVRSVR 
QGYWGYYLPDQDHGPEFSEFADFFATYKATLPVIGRLSRISGARIIPLFPVYDGKTHH 
LTIHVSPPLAIRQKSDAHIARQINEVVENFVRPHPEQYTWILKLLKTRKEGEEDPY" 
CONTIG  join(AB011549.2:1..92721) ###this line is not in the original file 
// 

Что можно сравнить с исходной базы данных GenBank файла: http://www.ncbi.nlm.nih.gov/nuccore/10955266/?report=genbank

Я могу подтвердить, что это не ошибка, связанная с DTD файлы, но все остальное вверх для захватов. (The new RefSeq release from NCBI is compatible with Bio.Entrez.Parser?)

Я бегу этот скрипт на CentOS Python 3.4.3 :: Anaconda 2.3.0 (64-разрядная версия) :: Biopython 1,66

+0

Какую версию Biopython вы используете? – MattDMo

+0

Я считаю, что это biopython-1.65. Я не могу найти способ сделать programName -version для Biopython - можете ли вы что-то предложить? – cer

+0

'import Bio; print (Bio .__ version __) 'скажет вам. Возможно, вы захотите обновить, 1.66 - последняя версия. Я запускал модифицированную версию вашего кода, и я не получаю никаких ошибок, но файлы Genbank не включают нуклеотидные последовательности, показанные в nuccore, они заканчиваются точно так же, как ваш пример. – MattDMo

ответ

0

NCBI Entrez выборки API различает типы rettype="gb" и rettype="gbwithparts" вернуться, первый может быть короче, предоставив вам строки CONTIG, ссылающиеся на другие записи, в то время как позднее они расширят их, чтобы дать вам полную последовательность (найдите «GenBank (полный)» на сайте).

Иногда вы можете увидеть это, когда что-то сломано на стороне NCBI, например. http://blastedbio.blogspot.co.uk/2012/03/missing-external-exons-in-genbank-with.html и http://blastedbio.blogspot.co.uk/2012/04/missing-feature-locations-in-genbank.html (фиксированный с).

Я бы предположил, что ошибка сокета, которую вы получаете, связана с вашим управлением доступом в Интернет.

+0

доступ действительно был проблемой. Не очень красивое решение, но я загружаю файлы на другой сервер (вне работы), а затем просматриваю файлы на моем рабочем сервере. – cer

+0

Спасибо, что подтвердили это. – peterjc