Swiss-Prot和ExPasy

解析Swiss-Prot文件

Swiss-Prot(https://web.expasy.org/docs/swiss-prot_guideline.html)是一个手工策划的蛋白质序列数据库。Biopython可以解析“纯文本”Swiss-Prot文件格式,该格式仍然用于结合Swiss-Prot、TrEmbL和PIR-SSD的UniProt知识库。

尽管在下文中我们重点关注较旧的人类可读纯文本格式, Bio.SeqIO 可以读取此格式和新的UniProt ML文件格式,用于注释蛋白质序列。

解析瑞士-普罗特记录

节中  从网络中解析SwissProt序列 ,我们描述了如何将Swiss-Prot记录的序列提取为 SeqRecord object.或者,您可以将Swiss-Prot记录存储在 Bio.SwissProt.Record 对象,它实际上存储了Swiss-Prot记录中包含的完整信息。在本节中,我们将介绍如何提取 Bio.SwissProt.Record Swiss-Prot文件中的对象。

要解析Swiss-Prot记录,我们首先获取Swiss-Prot记录的手柄。有多种方法可以做到这一点,具体取决于Swiss-Prot记录的存储位置和存储方式:

  • 本地打开Swiss-Prot文件:

    >>> handle = open("SwissProt/F2CXE6.txt")
    
  • 打开gzipped Swiss-Prot文件:

    >>> import gzip
    >>> handle = gzip.open("myswissprotfile.dat.gz", "rt")
    
  • 通过互联网打开Swiss-Prot文件:

    >>> from urllib.request import urlopen
    >>> url = "https://raw.githubusercontent.com/biopython/biopython/master/Tests/SwissProt/F2CXE6.txt"
    >>> handle = urlopen(url)
    

    在呼叫前打开存储在互联网上的文件 read .

  • 通过互联网从ExPasy数据库打开Swiss-Prot文件(请参阅部分 检索Swiss-Prot记录 ):

    >>> from Bio import ExPASy
    >>> handle = ExPASy.get_sprot_raw("F2CXE6")
    

关键点是,对于解析器来说,如何创建处理并不重要,只要它指向Swiss-Prot格式的数据即可。如果以二进制模式打开该手柄,解析器将自动将数据解码为ASCI(Swiss-Prot使用的编码)。

我们可以用 Bio.SeqIO 节所述  从网络中解析SwissProt序列 要获得文件格式不可知 SeqRecord 对象或者,我们可以使用 Bio.SwissProt 得到 Bio.SwissProt.Record 对象,它们与基础文件格式更接近匹配。

要从手柄读取一条Swiss-Prot记录,我们使用以下函数 read() :

>>> from Bio import SwissProt
>>> record = SwissProt.read(handle)

如果手柄恰好指向一个Swiss-Prot记录,则应使用此函数。它提出了一个 ValueError 如果没有找到Swiss-Prot记录,并且如果找到多个记录。

我们现在可以打印出有关此记录的一些信息:

>>> print(record.description)
SubName: Full=Plasma membrane intrinsic protein {ECO:0000313|EMBL:BAN04711.1}; SubName: Full=Predicted protein {ECO:0000313|EMBL:BAJ87517.1};
>>> for ref in record.references:
...     print("authors:", ref.authors)
...     print("title:", ref.title)
...
authors: Matsumoto T., Tanaka T., Sakai H., Amano N., Kanamori H., Kurita K., Kikuta A., Kamiya K., Yamamoto M., Ikawa H., Fujii N., Hori K., Itoh T., Sato K.
title: Comprehensive sequence analysis of 24,783 barley full-length cDNAs derived from 12 clone libraries.
authors: Shibasaka M., Sasano S., Utsugi S., Katsuhara M.
title: Functional characterization of a novel plasma membrane intrinsic protein2 in barley.
authors: Shibasaka M., Katsuhara M., Sasano S.
title:
>>> print(record.organism_classification)
['Eukaryota', 'Viridiplantae', 'Streptophyta', 'Embryophyta', 'Tracheophyta', 'Spermatophyta', 'Magnoliophyta', 'Liliopsida', 'Poales', 'Poaceae', 'BEP clade', 'Pooideae', 'Triticeae', 'Hordeum']

要分析包含多个Swiss-Prot记录的文件,我们使用 parse 相反,功能。该功能允许我们重写文件中的记录。

例如,让我们解析完整的Swiss-Prot数据库并收集所有描述。您可以从 ExPASy FTP site 作为单个gziped-file uniprot_sprot.dat.gz (约300 MB)。这是一个包含单个文件的压缩文件, uniprot_sprot.dat (over 1.5GB)。

如本节开头所述,您可以使用Python库 gzip 打开和解压 .gz 文件,像这样:

>>> import gzip
>>> handle = gzip.open("uniprot_sprot.dat.gz", "rt")

然而,解压缩大文件需要时间,每次以这种方式打开文件进行读取时,都必须立即解压缩。因此,如果您能腾出磁盘空间,从长远来看,如果您首先将文件重新加载到磁盘以获取 uniprot_sprot.dat 文件在里面。然后您可以像往常一样打开文件进行阅读:

>>> handle = open("uniprot_sprot.dat")

截至2009年6月,从ExPasy下载的完整Swiss-Prot数据库包含468851条Swiss-Prot记录。建立记录描述列表的一种简洁方法是使用列表理解:

>>> from Bio import SwissProt
>>> handle = open("uniprot_sprot.dat")
>>> descriptions = [record.description for record in SwissProt.parse(handle)]
>>> len(descriptions)
468851
>>> descriptions[:5]
['RecName: Full=Protein MGF 100-1R;',
 'RecName: Full=Protein MGF 100-1R;',
 'RecName: Full=Protein MGF 100-1R;',
 'RecName: Full=Protein MGF 100-1R;',
 'RecName: Full=Protein MGF 100-2L;']

或者,在记录迭代器上使用for循环:

>>> from Bio import SwissProt
>>> descriptions = []
>>> handle = open("uniprot_sprot.dat")
>>> for record in SwissProt.parse(handle):
...     descriptions.append(record.description)
...
>>> len(descriptions)
468851

由于这是一个如此大的输入文件,无论哪种方式在我的新台式计算机上都需要大约十一分钟(使用未压缩的 uniprot_sprot.dat 文件作为输入)。

从Swiss-Prot记录中提取您想要的任何类型的信息也同样容易。要查看瑞士抗议记录的成员,请使用

>>> dir(record)
['__doc__', '__init__', '__module__', 'accessions', 'annotation_update',
'comments', 'created', 'cross_references', 'data_class', 'description',
'entry_name', 'features', 'gene_name', 'host_organism', 'keywords',
'molecule_type', 'organelle', 'organism', 'organism_classification',
'references', 'seqinfo', 'sequence', 'sequence_length',
'sequence_update', 'taxonomy_id']

解析Swiss-Prot关键词和类别列表

Swiss-Prot还分发了一个文件 keywlist.txt ,其中列出了Swiss-Prot中使用的关键词和类别。该文件包含以下形式的条目:

ID   2Fe-2S.
AC   KW-0001
DE   Protein which contains at least one 2Fe-2S iron-sulfur cluster: 2 iron
DE   atoms complexed to 2 inorganic sulfides and 4 sulfur atoms of
DE   cysteines from the protein.
SY   Fe2S2; [2Fe-2S] cluster; [Fe2S2] cluster; Fe2/S2 (inorganic) cluster;
SY   Di-mu-sulfido-diiron; 2 iron, 2 sulfur cluster binding.
GO   GO:0051537; 2 iron, 2 sulfur cluster binding
HI   Ligand: Iron; Iron-sulfur; 2Fe-2S.
HI   Ligand: Metal-binding; 2Fe-2S.
CA   Ligand.
//
ID   3D-structure.
AC   KW-0002
DE   Protein, or part of a protein, whose three-dimensional structure has
DE   been resolved experimentally (for example by X-ray crystallography or
DE   NMR spectroscopy) and whose coordinates are available in the PDB
DE   database. Can also be used for theoretical models.
HI   Technical term: 3D-structure.
CA   Technical term.
//
ID   3Fe-4S.
...

此文件中的条目可以由 parse 功能 Bio.SwissProt.KeyWList module.然后每个条目都存储为 Bio.SwissProt.KeyWList.Record ,这是一个Python词典。

>>> from Bio.SwissProt import KeyWList
>>> handle = open("keywlist.txt")
>>> records = KeyWList.parse(handle)
>>> for record in records:
...     print(record["ID"])
...     print(record["DE"])
...

这个印刷品

2Fe-2S.
Protein which contains at least one 2Fe-2S iron-sulfur cluster: 2 iron atoms
complexed to 2 inorganic sulfides and 4 sulfur atoms of cysteines from the
protein.
...

解析前列腺素记录

Prosite是一个包含蛋白质结构域、蛋白质家族、功能位点以及识别它们的模式和概况的数据库。Prosite是与Swiss-Prot并行开发的。在Biopython中,Prosite记录由 Bio.ExPASy.Prosite.Record 类,其成员对应于Prosite记录中的不同字段。

一般来说,Prosite文件可以包含多个Prosite记录。例如,完整的Prosite记录,可以作为单个文件下载 (prosite.dat )来自 ExPASy FTP site ,包含2073条记录(20.24版本于2007年12月4日发布)。为了解析这样的文件,我们再次使用迭代器:

>>> from Bio.ExPASy import Prosite
>>> handle = open("myprositefile.dat")
>>> records = Prosite.parse(handle)

我们现在可以一次获取一份记录并打印一些信息。例如,使用包含完整Prosite数据库的文件,我们会发现

>>> from Bio.ExPASy import Prosite
>>> handle = open("prosite.dat")
>>> records = Prosite.parse(handle)
>>> record = next(records)
>>> record.accession
'PS00001'
>>> record.name
'ASN_GLYCOSYLATION'
>>> record.pdoc
'PDOC00001'
>>> record = next(records)
>>> record.accession
'PS00004'
>>> record.name
'CAMP_PHOSPHO_SITE'
>>> record.pdoc
'PDOC00004'
>>> record = next(records)
>>> record.accession
'PS00005'
>>> record.name
'PKC_PHOSPHO_SITE'
>>> record.pdoc
'PDOC00005'

等等。如果你想知道有多少Prosite记录,你可以使用

>>> from Bio.ExPASy import Prosite
>>> handle = open("prosite.dat")
>>> records = Prosite.parse(handle)
>>> n = 0
>>> for record in records:
...     n += 1
...
>>> n
2073

要从手柄中准确读取一个Prosite,您可以使用 read 功能:

>>> from Bio.ExPASy import Prosite
>>> handle = open("mysingleprositerecord.dat")
>>> record = Prosite.read(handle)

如果没有找到Prosite记录,并且如果找到多个Prosite记录,此函数也会引发Value错误。

解析Prosite文档记录

在上面的Prosite示例中, record.pdoc 登录号 'PDOC00001' , 'PDOC00004' , 'PDOC00005' 等等,请参阅Prosite文档。Prosite文档记录可以作为单独文件和一个文件从ExPasy获取 (prosite.doc )包含所有Prosite文档记录。

我们在 Bio.ExPASy.Prodoc 解析Prosite文档记录。例如,要创建Prosite文档记录的所有登录号的列表,您可以使用

>>> from Bio.ExPASy import Prodoc
>>> handle = open("prosite.doc")
>>> records = Prodoc.parse(handle)
>>> accessions = [record.accession for record in records]

再次 read() 提供的功能可以从手柄中准确读取一个Prosite文档记录。

解析酶记录

ExPasy的酶数据库是酶命名信息库。典型的酶记录如下:

ID   3.1.1.34
DE   Lipoprotein lipase.
AN   Clearing factor lipase.
AN   Diacylglycerol lipase.
AN   Diglyceride lipase.
CA   Triacylglycerol + H(2)O = diacylglycerol + a carboxylate.
CC   -!- Hydrolyzes triacylglycerols in chylomicrons and very low-density
CC       lipoproteins (VLDL).
CC   -!- Also hydrolyzes diacylglycerol.
PR   PROSITE; PDOC00110;
DR   P11151, LIPL_BOVIN ;  P11153, LIPL_CAVPO ;  P11602, LIPL_CHICK ;
DR   P55031, LIPL_FELCA ;  P06858, LIPL_HUMAN ;  P11152, LIPL_MOUSE ;
DR   O46647, LIPL_MUSVI ;  P49060, LIPL_PAPAN ;  P49923, LIPL_PIG   ;
DR   Q06000, LIPL_RAT   ;  Q29524, LIPL_SHEEP ;
//

在本例中,第一行显示脂蛋白脂肪酶的EC(酶委员会)编号(第二行)。脂蛋白脂肪酶的替代名称是“清除因子脂肪酶”、“二脂脂肪酶”和“二脂脂肪酶”(第3至5行)。以“CA”开头的线显示了该酶的催化活性。评论行以“CC”开头。“PR”行显示对Prosite文档记录的引用,“DR”行显示对Swiss-Prot记录的引用。这些条目中不一定存在于酶记录中。

在Biopython中,酶记录由 Bio.ExPASy.Enzyme.Record 课该记录来自Python字典,并且具有与酶文件中使用的两个字母代码相对应的键。要读取包含一个酶记录的酶文件,请使用 read 功能 Bio.ExPASy.Enzyme :

>>> from Bio.ExPASy import Enzyme
>>> with open("lipoprotein.txt") as handle:
...     record = Enzyme.read(handle)
...
>>> record["ID"]
'3.1.1.34'
>>> record["DE"]
'Lipoprotein lipase.'
>>> record["AN"]
['Clearing factor lipase.', 'Diacylglycerol lipase.', 'Diglyceride lipase.']
>>> record["CA"]
'Triacylglycerol + H(2)O = diacylglycerol + a carboxylate.'
>>> record["PR"]
['PDOC00110']
>>> record["CC"]
['Hydrolyzes triacylglycerols in chylomicrons and very low-density lipoproteins
(VLDL).', 'Also hydrolyzes diacylglycerol.']
>>> record["DR"]
[['P11151', 'LIPL_BOVIN'], ['P11153', 'LIPL_CAVPO'], ['P11602', 'LIPL_CHICK'],
['P55031', 'LIPL_FELCA'], ['P06858', 'LIPL_HUMAN'], ['P11152', 'LIPL_MOUSE'],
['O46647', 'LIPL_MUSVI'], ['P49060', 'LIPL_PAPAN'], ['P49923', 'LIPL_PIG'],
['Q06000', 'LIPL_RAT'], ['Q29524', 'LIPL_SHEEP']]

read 如果没有找到Enzene记录,并且如果找到多个Enzene记录,则函数会引发Value错误。

全套酶记录可以作为单个文件下载 (enzyme.dat )来自 ExPASy FTP site ,包含4877条记录(2009年3月3日发布)。要解析包含多个Enzymase记录的此类文件,请使用 parse 功能 Bio.ExPASy.Enzyme 要获取迭代器:

>>> from Bio.ExPASy import Enzyme
>>> handle = open("enzyme.dat")
>>> records = Enzyme.parse(handle)

我们现在可以一次重写一项记录。例如,我们可以列出可使用酶记录的所有EC编号:

>>> ecnumbers = [record["ID"] for record in records]

安装ExPASy服务器

Swiss-Prot、Prosite和Prosite文档记录可以从ExPasy网络服务器https://www.expasy.org下载。ExPasy提供四种查询:

get_prodoc_entry

下载HTML格式的Prosite文档记录

get_prosite_entry

下载HTML格式的Prosite记录

get_prosite_raw

以原始格式下载Prosite或Prosite文档记录

get_sprot_raw

要下载原始格式的Swiss-Prot记录

要从Python脚本访问此Web服务器,我们使用 Bio.ExPASy module.

检索Swiss-Prot记录

假设我们正在寻找兰花的查耳酮异黄酮(参见部分  使用示例 寻找兰花有趣的事情的一些理由)。查尔酮合酶参与植物中黄酮类化合物的生物合成,黄酮类化合物可以制造很多很酷的东西,例如色素和紫外线防护剂。

如果您在Swiss-Prot上搜索,您可以找到查耳酮合成酶的三种兰花蛋白,id号O23729、O23730、O23731。现在,让我们编写一个脚本来获取这些信息,并解析出一些有趣的信息。

首先,我们使用 get_sprot_raw() 功能 Bio.ExPASy .这个函数非常好,因为您可以向它提供id并返回原始文本记录的手柄(没有HTML可供摆弄!)。我们可以使用 Bio.SwissProt.read 拉出瑞士抗议记录,或者 Bio.SeqIO.read 以获取SeqRecord。下面的代码完成了我刚刚写的内容:

>>> from Bio import ExPASy
>>> from Bio import SwissProt

>>> accessions = ["O23729", "O23730", "O23731"]
>>> records = []

>>> for accession in accessions:
...     handle = ExPASy.get_sprot_raw(accession)
...     record = SwissProt.read(handle)
...     records.append(record)
...

如果您提供的登录号 ExPASy.get_sprot_raw 那么不存在 SwissProt.read(handle) 将筹集 ValueError .你可以赶上 ValueException 检测无效登录号的例外情况:

>>> for accession in accessions:
...     handle = ExPASy.get_sprot_raw(accession)
...     try:
...         record = SwissProt.read(handle)
...     except ValueException:
...         print("WARNING: Accession %s not found" % accession)
...     records.append(record)
...

使用UniProt搜索

现在,您可能会说我事先就知道这些记录的登录号。事实上, get_sprot_raw() 需要条目名称或登录号。当您手边没有它们时,您可以使用 UniProt 来寻找他们。您还可以使用UniProt包以编程方式搜索蛋白质。

例如,让我们搜索来自已审查的特定生物(生物ID:2697049)的蛋白质。我们可以使用以下代码做到这一点:

>>> from Bio import UniProt

>>> query = "(organism_id:2697049) AND (reviewed:true)"
>>> results = list(UniProt.search(query))

UniProt.search 方法返回搜索结果上的迭代器。迭代器一次返回一个结果,根据需要从UniProt获取更多结果,直到返回所有结果。我们可以为这个特定查询有效地从这个迭代器创建一个列表,因为这个查询只返回一些结果(撰写本文时为17个)。

让我们尝试返回更多结果的搜索。截至撰写本文时,查询“Insulin AND(已审核:true)”有5,147个结果。我们可以使用切片来获取前50个结果的列表。

>>> from Bio import UniProt
>>> from itertools import islice

>>> query = "Insulin AND (reviewed:true)"
>>> results = UniProt.search(query, batch_size=50)[:50]

您可以使用获取搜索结果总数(无论批量大小) len 方法:

>>> from Bio import UniProt

>>> query = "Insulin AND (reviewed:true)"
>>> result_iterator = UniProt.search(query, batch_size=0)
>>> len(result_iterator)
5147

检索Prosite和Prosite文档记录

Prosite和Prosite文档记录可以以HTML格式或原始格式检索。要使用Biopython解析Prosite和Prosite文档记录,您应该以原始格式检索记录。然而,出于其他目的,您可能对这些HTML格式的记录感兴趣。

要以原始格式检索Prosite或Prosite文档记录,请使用 get_prosite_raw() .例如,要下载Prosite记录并以原始文本格式打印出来,请使用

>>> from Bio import ExPASy
>>> handle = ExPASy.get_prosite_raw("PS00001")
>>> text = handle.read()
>>> print(text)

检索Prosite记录并将其解析为 Bio.Prosite.Record 对象、使用

>>> from Bio import ExPASy
>>> from Bio import Prosite
>>> handle = ExPASy.get_prosite_raw("PS00001")
>>> record = Prosite.read(handle)

相同的函数可用于检索Prosite文档记录并将其解析为 Bio.ExPASy.Prodoc.Record 对象:

>>> from Bio import ExPASy
>>> from Bio.ExPASy import Prodoc
>>> handle = ExPASy.get_prosite_raw("PDOC00001")
>>> record = Prodoc.read(handle)

对于不存在的登录号, ExPASy.get_prosite_raw 返回空字符串的手柄。当面对空字符串时, Prosite.readProdoc.read 将引发ValueHelp。您可以捕捉这些异常以检测无效的登录号。

的功能 get_prosite_entry()get_prodoc_entry() 用于下载HTML格式的Prosite和Prosite文档记录。要创建显示一条Prosite记录的网页,您可以使用

>>> from Bio import ExPASy
>>> handle = ExPASy.get_prosite_entry("PS00001")
>>> html = handle.read()
>>> with open("myprositerecord.html", "w") as out_handle:
...     out_handle.write(html)
...

对于Prosite文档记录也是如此:

>>> from Bio import ExPASy
>>> handle = ExPASy.get_prodoc_entry("PDOC00001")
>>> html = handle.read()
>>> with open("myprodocrecord.html", "w") as out_handle:
...     out_handle.write(html)
...

对于这些函数,无效的登录号会返回HTML格式的错误消息。

扫描Prosite数据库

ScanProsite 通过提供UniProt或DBC序列标识符或序列本身,您可以根据Prosite数据库在线扫描蛋白质序列。有关ScanProsite的更多信息,请参阅 ScanProsite documentation 以及该 documentation for programmatic access of ScanProsite .

您可以使用Biopython的 Bio.ExPASy.ScanProsite 从Python扫描Prosite数据库的模块。该模块既可以帮助您以编程方式访问ScanProsite,又可以解析ScanProsite返回的结果。扫描以下蛋白质序列中的Prosite模式:

MEHKEVVLLLLLFLKSGQGEPLDDYVNTQGASLFSVTKKQLGAGSIEECAAKCEEDEEFT
CRAFQYHSKEQQCVIMAENRKSSIIIRMRDVVLFEKKVYLSECKTGNGKNYRGTMSKTKN

您可以使用以下代码:

>>> sequence = (
...     "MEHKEVVLLLLLFLKSGQGEPLDDYVNTQGASLFSVTKKQLGAGSIEECAAKCEEDEEFT"
...     "CRAFQYHSKEQQCVIMAENRKSSIIIRMRDVVLFEKKVYLSECKTGNGKNYRGTMSKTKN"
... )
>>> from Bio.ExPASy import ScanProsite
>>> handle = ScanProsite.scan(seq=sequence)

通过执行 handle.read() ,您可以获得原始的HTML格式的搜索结果。相反,让我们使用 Bio.ExPASy.ScanProsite.read 要将原始文档解析为Python对象:

>>> result = ScanProsite.read(handle)
>>> type(result)
<class 'Bio.ExPASy.ScanProsite.Record'>

A Bio.ExPASy.ScanProsite.Record 对象从列表中派生,列表中的每个元素都存储一个ScanProsite命中。此对象还存储ScanProsite返回的命中数以及搜索序列数。这次ScanProsite搜索结果得到了六次点击:

>>> result.n_seq
1
>>> result.n_match
1
>>> len(result)
1
>>> result[0]
{'sequence_ac': 'USERSEQ1', 'start': 16, 'stop': 98, 'signature_ac': 'PS50948', 'score': '8.873', 'level': '0'}

其他ScanProsite参数可以作为关键字参数传递;请参阅 documentation for programmatic access of ScanProsite for more information.举个例子,通过 lowscore=1 要包含低级别分数的匹配,请使用查找一个额外的命中:

>>> handle = ScanProsite.scan(seq=sequence, lowscore=1)
>>> result = ScanProsite.read(handle)
>>> result.n_match
2