Spaces:
No application file
No application file
# Copyright 2000 by Jeffrey Chang. All rights reserved. | |
# This code is part of the Biopython distribution and governed by its | |
# license. Please see the LICENSE file that should have been included | |
# as part of this package. | |
"""Code to access resources at ExPASy over the WWW. | |
See https://www.expasy.org/ | |
Functions: | |
- get_prodoc_entry Interface to the get-prodoc-entry CGI script. | |
- get_prosite_entry Interface to the get-prosite-entry CGI script. | |
- get_prosite_raw Interface to the get-prosite-raw CGI script. | |
- get_sprot_raw Interface to the get-sprot-raw CGI script. | |
""" | |
import io | |
from urllib.request import urlopen | |
from urllib.error import HTTPError | |
def get_prodoc_entry( | |
id, cgi="https://prosite.expasy.org/cgi-bin/prosite/get-prodoc-entry" | |
): | |
"""Get a text handle to a PRODOC entry at ExPASy in HTML format. | |
>>> from Bio import ExPASy | |
>>> import os | |
>>> with ExPASy.get_prodoc_entry('PDOC00001') as in_handle: | |
... html = in_handle.read() | |
... | |
>>> with open("myprodocrecord.html", "w") as out_handle: | |
... length = out_handle.write(html) | |
... | |
>>> os.remove("myprodocrecord.html") # tidy up | |
For a non-existing key XXX, ExPASy returns an HTML-formatted page | |
containing this text: 'There is currently no PROSITE entry for' | |
""" | |
return _open(f"{cgi}?{id}") | |
def get_prosite_entry( | |
id, cgi="https://prosite.expasy.org/cgi-bin/prosite/get-prosite-entry" | |
): | |
"""Get a text handle to a PROSITE entry at ExPASy in HTML format. | |
>>> from Bio import ExPASy | |
>>> import os | |
>>> with ExPASy.get_prosite_entry('PS00001') as in_handle: | |
... html = in_handle.read() | |
... | |
>>> with open("myprositerecord.html", "w") as out_handle: | |
... length = out_handle.write(html) | |
... | |
>>> os.remove("myprositerecord.html") # tidy up | |
For a non-existing key XXX, ExPASy returns an HTML-formatted page | |
containing this text: 'There is currently no PROSITE entry for' | |
""" | |
return _open(f"{cgi}?{id}") | |
def get_prosite_raw(id, cgi=None): | |
"""Get a text handle to a raw PROSITE or PRODOC record at ExPASy. | |
The cgi argument is deprecated due to changes in the ExPASy | |
website. | |
>>> from Bio import ExPASy | |
>>> from Bio.ExPASy import Prosite | |
>>> with ExPASy.get_prosite_raw('PS00001') as handle: | |
... record = Prosite.read(handle) | |
... | |
>>> print(record.accession) | |
PS00001 | |
This function raises a ValueError if the identifier does not exist: | |
>>> handle = ExPASy.get_prosite_raw("DOES_NOT_EXIST") | |
Traceback (most recent call last): | |
... | |
ValueError: Failed to find entry 'DOES_NOT_EXIST' on ExPASy | |
""" | |
handle = _open(f"https://prosite.expasy.org/{id}.txt") | |
if handle.url == "https://www.expasy.org/": | |
raise ValueError(f"Failed to find entry '{id}' on ExPASy") from None | |
return handle | |
def get_sprot_raw(id): | |
"""Get a text handle to a raw SwissProt entry at ExPASy. | |
For an ID of XXX, fetches http://www.uniprot.org/uniprot/XXX.txt | |
(as per the https://www.expasy.org/expasy_urls.html documentation). | |
>>> from Bio import ExPASy | |
>>> from Bio import SwissProt | |
>>> with ExPASy.get_sprot_raw("O23729") as handle: | |
... record = SwissProt.read(handle) | |
... | |
>>> print(record.entry_name) | |
CHS3_BROFI | |
This function raises a ValueError if the identifier does not exist: | |
>>> ExPASy.get_sprot_raw("DOES_NOT_EXIST") | |
Traceback (most recent call last): | |
... | |
ValueError: Failed to find SwissProt entry 'DOES_NOT_EXIST' | |
""" | |
try: | |
handle = _open(f"http://www.uniprot.org/uniprot/{id}.txt") | |
except HTTPError as exception: | |
if exception.code in (400, 404): | |
raise ValueError(f"Failed to find SwissProt entry '{id}'") from None | |
else: | |
raise | |
return handle | |
def _open(url): | |
"""Open URL and convert to text assuming UTF-8 encoding (PRIVATE).""" | |
handle = urlopen(url) | |
text_handle = io.TextIOWrapper(handle, encoding="UTF-8") | |
text_handle.url = handle.url | |
return text_handle | |