我正在写一个程序,它从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
作为主要的标识符,与对应的(因为我使用这个词,有些东西告诉我应该为此创建一个字典?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
但是,我不知道如何访问注释字典的分类部分。拥有annotations=record.annotations
只需分配每个注释,而我只需要其中的一个或两个(分类法、序列长度)。有什么想法吗
是的,SeqRecords是非常完整的序列表示,但效率不高。最有效的数据结构可能是一个简单的字典,其中ID是键,值是一个具有固定位置的元组
(name, taxonomy, seq_length)
(您也可以使用namedtuple
,但我认为它们的性能稍差)。然后您甚至不需要存储SeqRecord,只需提取相关信息,然后将其丢弃:(我不记得确切的属性名,您可以使用
dir(record)
或here获得它们,但您已经知道了。)这将使以后的数据处理变得非常有效。您还需要对文件进行有效的解析吗?可能还有其他比使用SeqIO更快的方法,比如ElementTree
(How do I parse XML in Python?),但是除非这是一个时间关键的步骤,否则我不会费心相关问题 更多 >
编程相关推荐