ElementTree(1.3.0) Python中XML解析的高效方法

2023-12-09

我正在尝试解析一个巨大的 XML 文件(20MB-3GB)。文件是来自不同仪器的样本。所以,我正在做的是从文件中查找必要的元素信息并将它们插入到数据库(Django)中。

我的文件样本的一小部分。命名空间存在于所有文件中。文件的有趣特征是它们有节点属性多于文本

<?xml VERSION="1.0" encoding="ISO-8859-1"?>
<mzML xmlns="http://psi.hupo.org/ms/mzml" xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" xs:schemaLocation="http://psi.hupo.org/ms/mzml http://psidev.info/files/ms/mzML/xsd/mzML1.1.0.xsd" accession="plgs_example" version="1.1.0" id="urn:lsid:proteios.org:mzml.plgs_example">

    <instrumentConfiguration id="QTOF">
                    <cvParam cvRef="MS" accession="MS:1000189" name="Q-Tof ultima"/>
                    <componentList count="4">
                            <source order="1">
                                    <cvParam cvRef="MS" accession="MS:1000398" name="nanoelectrospray"/>
                            </source>
                            <analyzer order="2">
                                    <cvParam cvRef="MS" accession="MS:1000081" name="quadrupole"/>
                            </analyzer>
                            <analyzer order="3">
                                    <cvParam cvRef="MS" accession="MS:1000084" name="time-of-flight"/>
                            </analyzer>
                            <detector order="4">
                                    <cvParam cvRef="MS" accession="MS:1000114" name="microchannel plate detector"/>
                            </detector>
                    </componentList>
     </instrumentConfiguration>

小但完整的文件是here

所以到目前为止我所做的就是使用 findall 来处理每个感兴趣的元素。

import xml.etree.ElementTree as ET
tree=ET.parse('plgs_example.mzML')
root=tree.getroot()
NS="{http://psi.hupo.org/ms/mzml}"
s=tree.findall('.//{http://psi.hupo.org/ms/mzml}instrumentConfiguration')
for ins in range(len(s)):
    insattrib=s[ins].attrib
    # It will print out all the id attribute of instrument
    print insattrib["id"] 

如何访问仪器配置元素的所有子/孙子元素?

s=tree.findall('.//{http://psi.hupo.org/ms/mzml}instrumentConfiguration')

我想要的例子

InstrumentConfiguration
-----------------------
Id:QTOF
Parameter1: T-Tof ultima
source:nanoelectrospray
analyzer: quadrupole
analyzer: time-of-flight
detector: microchannel plate decector

当命名空间存在时,是否有有效的方法来解析元素/子元素/子元素?或者我每次都必须使用 find/findall 来访问具有命名空间的树中的特定元素?这只是一个小例子,我必须解析更复杂的元素层次结构。

有什么建议么!

Edit

没有得到正确答案,所以必须再次编辑!


这是一个解析一百万的脚本<instrumentConfiguration/>元素(967MB文件)中40秒(在我的机器上)而不消耗大量内存。

吞吐量为24MB/s. The cElementTree page (2005)报告47MB/s.

#!/usr/bin/env python
from itertools import imap, islice, izip
from operator  import itemgetter
from xml.etree import cElementTree as etree

def parsexml(filename):
    it = imap(itemgetter(1),
              iter(etree.iterparse(filename, events=('start',))))
    root = next(it) # get root element
    for elem in it:
        if elem.tag == '{http://psi.hupo.org/ms/mzml}instrumentConfiguration':
            values = [('Id', elem.get('id')),
                      ('Parameter1', next(it).get('name'))] # cvParam
            componentList_count = int(next(it).get('count'))
            for parent, child in islice(izip(it, it), componentList_count):
                key = parent.tag.partition('}')[2]
                value = child.get('name')
                assert child.tag.endswith('cvParam')
                values.append((key, value))
            yield values
            root.clear() # preserve memory

def print_values(it):
    for line in (': '.join(val) for conf in it for val in conf):
        print(line)

print_values(parsexml(filename))

Output

$ /usr/bin/time python parse_mxml.py
Id: QTOF
Parameter1: Q-Tof ultima
source: nanoelectrospray
analyzer: quadrupole
analyzer: time-of-flight
detector: microchannel plate detector
38.51user 1.16system 0:40.09elapsed 98%CPU (0avgtext+0avgdata 23360maxresident)k
1984784inputs+0outputs (2major+1634minor)pagefaults 0swaps

Note: 代码很脆弱它假设前两个孩子<instrumentConfiguration/> are <cvParam/> and <componentList/>所有值都可用作标记名称或属​​性。

论性能

在这种情况下,ElementTree 1.3 比 cElementTree 1.0.6 慢约 6 倍。

如果你更换root.clear() by elem.clear()那么代码速度会快 10%,但内存会多 10 倍。lxml.etreeelem.clear()变体,性能与cElementTree但它消耗 20 (root.clear()) / 2 (elem.clear()) 倍内存 (500MB)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ElementTree(1.3.0) Python中XML解析的高效方法 的相关文章

随机推荐

  • Rails 迁移:建立_连接在错误的数据库中创建表

    我想在数据库中创建一个新表 而不是在我的database yml 文件中定义的表 这是我的database yml 文件 development adapter mysql2
  • 如何:使用 wix 工具集使程序在 Windows 启动时启动?

    我有简单的 Hello world Windows 窗体应用程序 在 VS 2013 中创建 如何使用 WIX Toolset 使应用程序在 Windows 启动时启动 必须在 Windows 7 和 Windows 8 中运行 这是我目前
  • 带有 angularjs 的材料设计 md-tabs

    我有一个关于材料设计 md tabs 控制的问题 我在其中一个页面上使用 md tabs 和 Angularjs 效果很好 我在该页面上还有一个 md 按钮 我们想要做的是 当用户单击该按钮时 我们想要移动到下一个选项卡 我对整个材料角度的
  • Java 类型泛型作为 GSON 的参数

    在 GSON 中获取你所做的对象列表 Gson gson new Gson Type token new TypeToken
  • 使用 MongoDB 压缩数组

    是否可以在 mongo 文档中压缩数组 我指的是 zip 的函数式编程定义 其中相应的项被配对成元组 更准确地说 我想从这样的 mongo 文档开始 A A1 A2 A3 B B1 B2 B3 C 100 0 200 0 300 0 最终得
  • 连接到与登录 google colab 不同的 google 驱动器

    最近 colab 删除了从您在 google 云端硬盘中登录的帐户以外的其他帐户连接到 google 云端硬盘的功能 有人发布了一个使用以下代码的解决方法 效果很好 直到现在 apt get install y qq software pr
  • 理解结构等价

    我有两种类型的结构等价思想我正在努力理解 VAR 1 int VAR 2 pointer to VAR 1 所以在这里 我觉得它们在结构上是等效的 因为从技术上讲 这些类型都指向整数类型 对吗 但如果你有类似的东西 VAR 3 pointe
  • Crystal Report Viewer 打印/导出按钮在 ASP.NET MVC 应用程序中不起作用

    我的 MVC 应用程序使用推送模型和 CR 查看器进行报告 在查看器中显示报告时一切都很好 但是打印 导出按钮给出了 JavaScript 错误 此操作不支持对象 我正在使用 VS 2008 和 MVC 这发生在我的开发环境中 有任何想法吗
  • Android 中的自定义字体(适用于整个应用程序)[重复]

    这个问题在这里已经有答案了 我有这个 android 代码 其中有许多类 每个类都有不同的视图 我们可以进入设置并根据所选的字体更改其字体 目前仅预装的 Android 字体可用 有没有办法稍微调整我的代码 以便我可以添加 ttf 文件并将
  • 如何知道 Azure 服务器是否使用 TLS 1.2

    我们有一个托管在 Azure 服务器中的 Web 应用程序 使用 Azure 服务器中的 api 出于安全目的 我们想知道服务器是否处于 tls 1 2 之下 我想对于非云服务器 我们只需在 regedit 中查看即可知道 我已经看到有关如
  • 线程是内核对象吗?

    在这本书中 我读到每个实例Thread类实际上正在分配一个内核对象 这是使用的开销之一Thread 据我所知 线程不是内核对象 在这种情况下只有进程是内核对象 进程包含的线程不是内核对象 有人可以解释一下吗 线程首先是一个托管对象 你知道S
  • 如何将 JavaScript 侦听器添加到 PrimeFaces Ajax 事件

    我想通过javascript方法监听pickList传输事件 侦听器与 java bean 配合良好
  • Django + Mongo + Docker 获取 pymongo.errors.ServerSelectionTimeoutError

    我一直在努力使用 Django Djongo Mongodb 和 Docker Compose 运行一个简单的应用程序 我的设置如下所示 docker compose yml services mongodb image mongo lat
  • PackageMaker 的“在包中包含根”选项实际上有什么作用?

    我正在为 OS X 应用程序制作安装程序 但无法理解 PackageMaker 的 UI 我的 PackageMaker 版本是 3 0 4 与 Lion 和 Xcode 4 1 一起运行 其中一个选项尤其让我感到困惑 这是编辑包内容时的
  • 为什么我必须最后调用 super -dealloc,而不是首先调用?

    正确的例子 void dealloc viewController release window release super dealloc 错误的例子 void dealloc super dealloc viewController r
  • 删除QListView背景

    我想删除我的 QListView 的背景 以便可以看到下面的背景 我怎样才能做到这一点 I tried setAttribute Qt WA NoSystemBackground and setAttribute Qt WA NoBackg
  • 通过pywin32将pandas数据框写入word文档表

    我目前正在编写一个脚本 需要写入 docx 文件以进行演示 我使用 pandas 来处理脚本中的所有数据计算 我希望使用 PyWIN32 将 pandas 数据帧写入 word docx 文件中书签处的表中 数据框由浮点数组成 伪代码是这样
  • 如何创建其中包含永久提示的编辑文本

    我有一个编辑文本 用户在其中输入金额 我想要做的是在其前面设置一个用户不可编辑的文本视图值 例如 INR 然后用户将在其前面输入金额 我希望 edittext 看起来像下面的那样 我怎样才能做到这一点
  • Laravel 4 Auth with Facebook(无密码身份验证)

    我正在尝试使用 Laravel 4 设置一个通过 Facebook 登录的身份验证系统 我正在为 Laravel 4 使用 madewithlove laravel oauth2 包 当然 当用户使用 Facebook 登录时 没有密码可以
  • ElementTree(1.3.0) Python中XML解析的高效方法

    我正在尝试解析一个巨大的 XML 文件 20MB 3GB 文件是来自不同仪器的样本 所以 我正在做的是从文件中查找必要的元素信息并将它们插入到数据库 Django 中 我的文件样本的一小部分 命名空间存在于所有文件中 文件的有趣特征是它们有