如何有效地读取大型XML文件并创建自定义对象? (Biopython SeqIO)

问题描述 投票:0回答:1

我正在编写一个程序,该程序从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文件中每个记录的必需属性存储为massive。

例如,在上述蛋白质中,我希望将ID作为主要标识符,并带有相应的标识符(因为我正在使用该词,所以有些东西告诉我我应该为此创建字典吗?)Nametaxonomysequence_length。但是我不确定是否可以创建新的对象数据集,如果仍然可以将其视为SeqRecord对象?

我已经阅读了SeqRecord类文档,但是并没有完全涵盖我想做的事情,因此我只需要一点指导。很抱歉,如果很明显,仍然可以绕开其中!

python python-3.x biopython
1个回答
0
投票

是的,SeqRecords是非常完整的序列表示形式,但是效率不高。对于您而言,最有效的数据结构可能是一个简单的字典,其中ID是键,值是具有固定位置(name, taxonomy, seq_length)的元组(您也可以使用namedtuple,但它们的性能略有不同)我认为更糟)。然后,您甚至不需要存储SeqRecord,您只需提取相关信息然后丢弃它即可。这将在以后实现非常有效的数据处理。您还需要对文件进行有效的解析吗?除了使用SeqIO之外,还有其他更快的方法,例如ElementTreeHow do I parse XML in Python?),但除非是时间紧迫的步骤,否则我不会打扰。

© www.soinside.com 2019 - 2024. All rights reserved.