2017-07-26 69 views
1

嘿,我的腳本有什麼問題?它響應不好的請求。我不知道什麼是錯錯誤的請求biopython有什麼問題

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



    def fetch(ID): 
     handle = Entrez.efetch(db = 'Protein', id = ID, retmode = 'fasta', rettype = 'text') #<--- here 
     seq = handle.read() 
     time.sleep(1) 
     return seq 
    ids = ['ATK1','Cat','Lig1'] 
    out = [fetch(id) for id in ids] 
    with open('out.fasta', 'w') as f: 
     f.writelines(out) 

引用:

File "<ipython-input-42-0be173f176eb>", line 1, in <module> 
runfile('C:/Users/MGrad/bioPythonSearch.py', wdir='C:/Users/MGrad/Dropbox/Leg') 

File "C:\Users\MGrad\AppData\Local\conda\conda\envs\my_root\lib\site-packages\spyder\utils\site\sitecustomize.py", line 880, in runfile 
execfile(filename, namespace) 

File "C:\Users\Local\conda\conda\envs\my_root\lib\site-packages\spyder\utils\site\sitecustomize.py", line 102, in execfile 
exec(compile(f.read(), filename, 'exec'), namespace) 

File "C:/Users/Leg/bioPythonSearch.py", line 20, in <module> 
out = [fetch(id) for id in ids] # where ids is a Python list containing gene ids/accession numbers 

File "C:/Users/MGrad/bioPythonSearch.py", line 20, in <listcomp> 
out = [fetch(id) for id in ids] # where ids is a Python list containing gene ids/accession numbers 

File "C:/Users/MGrad/bioPythonSearch.py", line 14, in fetch 
handle = Entrez.efetch(db = 'Protein', id = ID, retmode = 'fasta', rettype = 'text') 

File "C:\Users\MGrad\AppData\Local\conda\conda\envs\my_root\lib\site-packages\Bio\Entrez\__init__.py", line 180, in efetch 
return _open(cgi, variables, post=post) 

File "C:\Users\MGrad\AppData\Local\conda\conda\envs\my_root\lib\site-packages\Bio\Entrez\__init__.py", line 526, in _open 
raise exception 

File "C:\Users\MGrad\AppData\Local\conda\conda\envs\my_root\lib\site-packages\Bio\Entrez\__init__.py", line 524, in _open 
handle = _urlopen(cgi) 

File "C:\Users\MGrad\AppData\Local\conda\conda\envs\my_root\lib\urllib\request.py", line 223, in urlopen 
return opener.open(url, data, timeout) 

File "C:\Users\MGrad\AppData\Local\conda\conda\envs\my_root\lib\urllib\request.py", line 532, in open 
response = meth(req, response) 

File "C:\Users\MGrad\AppData\Local\conda\conda\envs\my_root\lib\urllib\request.py", line 642, in http_response 
'http', request, response, code, msg, hdrs) 

File "C:\Users\MGrad\AppData\Local\conda\conda\envs\my_root\lib\urllib\request.py", line 570, in error 
return self._call_chain(*args) 

File "C:\Users\MGrad\AppData\Local\conda\conda\envs\my_root\lib\urllib\request.py", line 504, in _call_chain 
result = func(*args) 

File "C:\Users\MGrad\AppData\Local\conda\conda\envs\my_root\lib\urllib\request.py", line 650, in http_error_default 
raise HTTPError(req.full_url, code, msg, hdrs, fp) 

HTTPError: Bad Request 
+0

請發佈完整的錯誤/追溯。目前,您正在依賴於知道該特定庫的人,但它可能更通用 – roganjosh

+0

HTTPError:錯誤請求 – MTG

+0

這是報告的整個錯誤的100%?沒有回溯? – roganjosh

回答

2

Entrez.efetch()作品有確切的ID號。如果您想查找像ATK1這樣的術語,則需要先通過Entrez.esearch()將其解析爲一個或多個ID號。這裏有一個簡單,但工作,例如:

import time 
from Bio import SeqIO 
from Bio import Entrez 

import xml.etree.cElementTree as ElementTree 

TERMS = ['ATK1', 'Cat', 'Lig1'] 

Entrez.email = '[email protected]' 

def fetch(term): 
    # retmax=1 just returns first result of possibly many; i.e. may be wrong, use more specific ID 
    handle = Entrez.esearch(db='Protein', term=term, retmax=1) 
    root = ElementTree.fromstring(handle.read()) 

    id_number = root.find("IdList/Id").text 

    print(term, '->', id_number) # ATK1 -> 1039008188 

    handle = Entrez.efetch(db='Protein', id=id_number, retmode='text', rettype='fasta') 
    seq_record = SeqIO.read(handle, 'fasta') 

    time.sleep(1) 
    return seq_record 

out = [fetch(my_term) for my_term in TERMS] 

with open('out.fasta', 'w') as f: 
    for record in out: 
     SeqIO.write(record, f, 'fasta') 

Entrez.esearch()結果回來作爲一個XML文檔,所以我們使用cElementTree解析它。這個查詢有多個結果,但我們天真地只是要求一個 - 你需要通過檢查多個結果或提供更具體的術語來解決這個問題。

此外,您的代碼將retmoderettype的值反轉。

+0

感謝您的幫助! – MTG

相關問題