作者:书苑幽香 | 来源:互联网 | 2023-05-27 08:31
我正在编写一个程序,该程序从UniProt提取一个充满蛋白质序列的大型XML文件,并对它们进行分析。我已经有一个工作版本,但是是用于较小的文件。现在,我需要高效地加载完整的UniProt数据库,并且不确定如何进行操作。我还想从创建的SeqRecord
对象中提取特定的属性,所以只有我感兴趣的数据。我有以下内容:
import gzip
from Bio import SeqIO
file = "/Users/john/workspace/project-2/resources/uniprot_sprot_small.xml.gz"
def load_uniprot_records():
records = []
handle = gzip.open(file)
for record in SeqIO.parse(handle,"uniprot-xml"):
records.append(record)
print(record)
if __name__ == "__main__":
load_uniprot_records()
这将显示一些类似于以下的记录:
ID: Q6GZX4
Name: 001R_FRG3G
Description: Putative transcription factor 001R
Database cross-references: DOI:10.1016/j.virol.2004.02.019,EMBL:AY548484,GO:GO:0046782,GeneID:2947773,InterPro:IPR007031,KEGG:vg:2947773,NCBI Taxonomy:654924,Pfam:PF04947,Proteomes:UP000008770,PubMed:15165820,RefSeq:YP_031579.1,Swiss-Prot:001R_FRG3G,Swiss-Prot:Q6GZX4,Swisspalm:Q6GZX4
Number of features: 2
/dataset=Swiss-Prot
/created=2011-06-28
/modified=2019-06-05
/version=37
/accessiOns=['Q6GZX4']
/recommendedName_fullName=['Putative transcription factor 001R']
/gene_name_ORF=['FV3-001R']
/taxOnomy=['Viruses','Iridoviridae','Alphairidovirinae','Ranavirus']
/organism=Frog virus 3 (isolate Goorha) (FV-3)
/organism_host=['Ambystoma','mole salamanders','Dryophytes versicolor','chameleon treefrog','lithobates pipiens','Northern leopard frog','Rana pipiens','Notophthalmus viridescens','Eastern newt','Triturus viridescens','Rana sylvatica','Wood frog']
/references=[Reference(title='Comparative genomic analyses of frog virus 3,type species of the genus Ranavirus (family Iridoviridae).',...)]
/comment_function=['Transcription activation.']
/proteinExistence=['predicted']
/keywords=['activator','Complete proteome','Reference proteome','Transcription','Transcription regulation']
/type=['ECO:0000305']
/key=['1']
/sequence_length=256
/sequence_mass=29735
/sequence_checksum=B4840739BF7D4121
/sequence_modified=2004-07-19
/sequence_version=1
Seq('MAFSAEDVLKEYDRRRRMEALLLSLYYPNDRKLLDYKEWSPPRVQVECPKAPVE...TPL',ProteinAlphabet())
我想实现一个高效的功能,以仅将每个记录中所需的属性存储在UniProt文件中,该文件大量。
例如,在上述蛋白质中,我希望将ID
作为主要标识符,并带有相应的标识符(因为我正在使用该词,所以有人告诉我应该为此创建字典吗?){ {1}},Name
,taxonomy
。但是,我不确定是否可以创建新的对象数据集,是否仍可以将其视为sequence_length
对象?
我已经阅读了SeqRecord类文档,但是并没有涵盖我要尝试做的事情,因此我只需要一点指导。很抱歉,如果很明显,仍然可以绕开我的脑袋!
编辑:
现在已经
SeqRecord
但是,不知道如何仅访问注释字典的分类法部分。使用def load_uniprot_records():
file = "/Users/john/workspace/practical-2/resources/uniprot_sprot_small.xml.gz"
seq_records = []
handle = gzip.open(file)
for record in SeqIO.parse(handle,"uniprot-xml"):
seq_record = SeqRecord(seq=record.seq,id=record.id,name=record.name,description=record.description,annotatiOns=record.annotations)
seq_records.append(seq_record)
return seq_records
只需分配每个注释,而我只需要其中一个或两个(分类法,sequence_length)。有什么想法吗?
是的,SeqRecords是非常完整的序列表示形式,但是效率不高。对于您而言,最有效的数据结构可能是一个简单的字典,其中ID是键,值是具有固定位置(name,taxonomy,seq_length)
的元组(您也可以为此使用namedtuple
我相信他们的表现略差)。然后,您甚至不需要存储SeqRecord,只需提取相关信息然后丢弃它即可:
seq_records = {} # keys remain ordered since Python 3.7 :)
for record in SeqIO.parse(handle,"uniprot-xml"):
name = record.name
description = record.description
seq_length = len(record)
seq_records[record.id] = (name,description,seq_length)
(我不记得确切的属性名称,可以使用dir(record)
或here来获得它们,但是您知道了。)这将在以后实现非常有效的数据处理。您还需要对文件进行有效的解析吗?除了使用SeqIO以外,还有其他更快的方法,例如ElementTree
(How do I parse XML in Python?),但是除非是时间紧迫的步骤,否则我不会打扰。