在我的一个脚本中,我使用以下代码块来使用另一种类型的 ID 来查询蛋白质的 ID:
import os
import sys
import urllib.request
uniprot = 'A0A0M3KKX3'
url = 'https://www.uniprot.org/uploadlists/'
params = {
'from': 'ACC',
'to': 'PDB_ID',
'format': 'tab',
'query': uniprot,
'species': 'human'
}
dat = urllib.parse.urlencode(params)
dat = dat.encode('utf-8')
req = urllib.request.Request(url, dat)
with urllib.request.urlopen(req) as f:
response = f.read()
在过去的几个月里,涉及此方法的代码运行可靠,使我能够在这些功能的基础上构建我的算法。然而,截至昨晚,运行相同的代码,我收到以下错误:
Traceback (most recent call last):
File "\\wsl.localhost\Ubuntu\home\defrondevillec\FASTAtest.py", line 21, in <module>
with urllib.request.urlopen(req) as f:
File "C:\Users\chris\AppData\Local\Programs\Python\Python310\lib\urllib\request.py", line 216, in urlopen
return opener.open(url, data, timeout)
File "C:\Users\chris\AppData\Local\Programs\Python\Python310\lib\urllib\request.py", line 525, in open
response = meth(req, response)
File "C:\Users\chris\AppData\Local\Programs\Python\Python310\lib\urllib\request.py", line 634, in http_response
response = self.parent.error(
File "C:\Users\chris\AppData\Local\Programs\Python\Python310\lib\urllib\request.py", line 563, in error
return self._call_chain(*args)
File "C:\Users\chris\AppData\Local\Programs\Python\Python310\lib\urllib\request.py", line 496, in _call_chain
result = func(*args)
File "C:\Users\chris\AppData\Local\Programs\Python\Python310\lib\urllib\request.py", line 643, in http_error_default
raise HTTPError(req.full_url, code, msg, hdrs, fp)
urllib.error.HTTPError: HTTP Error 405: Not Allowed
我该如何解决这个问题?
我刚刚遇到了同样的问题 - Uniprot 推出了新网站和一系列服务。目前旧的可以在
legacy.uniprot.org
购买
使用
https://legacy.uniprot.org/uploadlists/
作为代码中的 URL。这在我的代码中用于类似的查询(uniprotID -> 基因名称)
可能最好迁移到新的 ID 映射服务,该服务记录在此处: https://www.uniprot.org/help/id_mapping
您现在需要发出 ID 映射请求,该请求返回作业 ID,然后轮询结果,文档底部有一些示例 python 代码:https://www.uniprot.org/help/ id_mapping#python-example(转载如下)
import requests
import time
import json
POLLING_INTERVAL = 3
API_URL = "https://rest.uniprot.org"
def submit_id_mapping(fromDB, toDB, ids):
r = requests.post(
f"{API_URL}/idmapping/run", data={"from": fromDB, "to": toDB, "ids": ids},
)
r.raise_for_status()
return r.json()["jobId"]
def get_id_mapping_results(job_id):
while True:
r = requests.get(f"{API_URL}/idmapping/status/{job_id}")
r.raise_for_status()
job = r.json()
if "jobStatus" in job:
if job["jobStatus"] == "RUNNING":
print(f"Retrying in {POLLING_INTERVAL}s")
time.sleep(POLLING_INTERVAL)
else:
raise Exception(job["jobStatus"])
else:
return job
job_id = submit_id_mapping(
fromDB="UniProtKB_AC-ID", toDB="ChEMBL", ids=["P05067", "P12345"]
)
results = get_id_mapping_results(job_id)
print(json.dumps(results, indent=2))
您现在可以使用 Michael Milton (@multimeric) 的 Unipressed 包在 Python 中进行 ID 映射,请参阅公告。该软件包还适用于 UniProt 2022 年的新 REST API。
使用 Unipressed 的原始帖子示例:
from unipressed import IdMappingClient
request = IdMappingClient.submit(
source="UniProtKB_AC-ID", dest="PDB", ids={"A0A0M3KKX3"}
)
list(request.each_result())
结果:
[{'from': 'A0A0M3KKX3', 'to': '4U7N'},
{'from': 'A0A0M3KKX3', 'to': '4U7O'},
{'from': 'A0A0M3KKX3', 'to': '4ZKI'}]
参见使用它将三个人类基因 ID 映射到 UniProt 标识符/登录代码的示例此处。该帖子还包含有关 Unpressed 套餐的更多信息以及锻炼
source
和目的地 (dest
) 详细信息的建议的链接。
查看更多使用 Unipressed 访问 Uniprot 的新 REST API 的示例 在我对 Biostar 帖子“使用 REST API 访问 UNIPROT”的回复中,以及底部包括根据“从 - 到”结果制作 Pandas 数据帧.
更新:我制作了一个存储库,允许直接在浏览器中运行此示例和其他 Unpressed 示例,而无需在计算机上安装任何内容。要开始使用,请转到此处并单击任何“
launch binder
”徽章。