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.read
和 Prodoc.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