如何高效地读取大型XML文件并创建自定义对象(Biopython(红杉)

2024-04-29 11:43:04 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在写一个程序,它从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作为主要的标识符,与对应的(因为我使用这个词,有些东西告诉我应该为此创建一个字典?Nametaxonomysequence_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只需分配每个注释,而我只需要其中的一个或两个(分类法、序列长度)。有什么想法吗


Tags: 文件对象namexmlseqrecordrecordseqfile
1条回答
网友
1楼 · 发布于 2024-04-29 11:43:04

是的,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更快的方法,比如ElementTreeHow do I parse XML in Python?),但是除非这是一个时间关键的步骤,否则我不会费心

相关问题 更多 >