使用python ElementTree的itertree函数并将修改后的树写入输出文件

2023-11-26

我需要解析一个非常大(~40GB)的 XML 文件,从中删除某些元素,然后将结果写入新的 xml 文件。我一直在尝试使用 python 的 ElementTree 中的 iterparse,但我对如何修改树然后将生成的树写入新的 XML 文件感到困惑。我已经阅读了 itertree 上的文档,但它还没有弄清楚。有什么简单的方法可以做到这一点吗?

谢谢你!

编辑:这是我到目前为止所拥有的。

import xml.etree.ElementTree as ET
import re 

date_pages = []
f=open('dates_texts.xml', 'w+')

tree = ET.iterparse("sample.xml")

for i, element in tree:
    if element.tag == 'page':
        for page_element in element:
            if page_element.tag == 'revision':
                for revision_element in page_element:
                    if revision_element.tag == '{text':
                        if len(re.findall('20\d\d', revision_element.text.encode('utf8'))) == 0:
                            element.clear()

如果您有一个大的 xml 无法放入内存,那么您可以尝试一次序列化它一个元素。例如,假设<root><page/><page/><page/>...</root>文档结构并忽略可能的命名空间问题:

import xml.etree.cElementTree as etree

def getelements(filename_or_file, tag):
    context = iter(etree.iterparse(filename_or_file, events=('start', 'end')))
    _, root = next(context) # get root element
    for event, elem in context:
        if event == 'end' and elem.tag == tag:
            yield elem
            root.clear() # free memory

with open('output.xml', 'wb') as file:
    # start root
    file.write(b'<root>')

    for page in getelements('sample.xml', 'page'):
        if keep(page):
            file.write(etree.tostring(page, encoding='utf-8'))

    # close root
    file.write(b'</root>')

where keep(page)回报True if page应保留,例如:

import re

def keep(page):
    # all <revision> elements must have 20xx in them
    return all(re.search(r'20\d\d', rev.text)
               for rev in page.iterfind('revision'))

为了比较,修改smallxml 文件,您可以:

# parse small xml
tree = etree.parse('sample.xml')

# remove some root/page elements from xml
root = tree.getroot()
for page in root.findall('page'):
    if not keep(page):
        root.remove(page) # modify inplace

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

使用python ElementTree的itertree函数并将修改后的树写入输出文件 的相关文章

随机推荐

  • 您是如何学习的/学习 Silverlight 的最佳方式

    所以我在 stackoverflow 上搜索过 似乎没有任何答案 因此 如果可以的话 真正完全学习 silverlight 的最佳方法是什么 我有这方面的书 但似乎当你读到 30 章中的第 15 章时 你已经有点忘记了所学的内容 必须重新开
  • 将数组保存为 xml

    array name gt text surname gt text country gt text date gt text 1 如何将此数组保存为 xml 文件 2 如何读取这个文件作为数组 save doc new DOMDocume
  • 我可以在 JavaScript 中将数组附加到“formdata”吗?

    我正在使用 FormData 上传文件 我还想发送一系列其他数据 当我只发送图像时 效果很好 当我将一些文本附加到表单数据时 它工作正常 当我尝试附加下面的 标签 数组时 其他一切都正常 但没有发送数组 FormData 和附加数组有任何已
  • 在 Windows 启动时启动 Window

    我希望我的应用程序 WPFWindow 在 Windows 启动时启动 我尝试了不同的解决方案 但似乎没有一个有效 我必须在代码中写什么才能做到这一点 当您说必须向注册表添加一个密钥时 您是正确的 添加一个键 HKEY CURRENT US
  • 如何在 Erlang 中处理 SIGINT?

    感谢 Google 和大量教程 我知道如何用 Java Python Ruby Perl 和 Lisp 创建自定义信号处理程序 我无法在线找到如何在 Erlang 中为 SIGINT SIGTERM HUP 等创建处理程序 你不能 操作系统
  • 如何修复对 inflate/deflate 函数的未定义引用?

    我正在尝试编译示例中提供的现有代码zlib 但它本身就给了我错误 nikhil nikhil Vostro 3500 zlib 1 2 8 examples gcc o zpipe g zpipe c tmp ccVZzqsb o In f
  • shell 脚本的第一行空白:解释 UID 变量的行为

    我有两个非常简单的脚本 区别仅在于第一行存在空白 cat test bash bin bash echo UID cat test blank bash bin bash echo UID 现在我跑步 无论有没有nice test bash
  • 如何让 PHP 会话在 30 分钟后过期?

    我需要让一个会话保持 30 分钟的活动状态 然后销毁它 Answer recommended by PHP Collective 您应该实现自己的会话超时 其他人提到的两个选项 会话 gc maxlifetime and session c
  • 如何解决 http 和站点行为:android 应用程序中的导航错误?

    最近我将 android 9 更新到 android 10 但不幸的是 该应用程序有时会崩溃并给出此错误 com fgapps maker E chromium ERROR cookie manager cc 137 Strict Secu
  • 智能支付按钮为 IPN 传递自定义变量

    我的网站上有两个用于每月订阅的智能按钮 运行良好 我成功收到 IPN 响应 其中付款信息已准备好添加到数据库中 但我需要通过 IPN 响应获取应用程序的 UserID 如何使用智能支付按钮传递自定义变量 以便将其传递到 IPN 如果可能的话
  • Maven 本地存储库与 leiningen 的依赖关系

    我正在开始lein newclojure 中的项目并想要使用goose文章提取库 不幸的是 我在任何公开可用的 Maven 存储库中都找不到该库的 jar 因此我开始将其添加到本地 Maven 存储库中 在项目目录中 我复制了 goose
  • 如何在 Python 中使用 BeautifulSoup 找到文本字符串后的表格?

    我正在尝试从几个网页中提取数据 这些网页的显示方式并不统一 我需要编写代码来搜索文本字符串 然后转到紧随该特定文本字符串的表 然后我想提取该表的内容 这是我到目前为止所得到的 from BeautifulSoup import Beauti
  • 如何确定 Office 加载项是否在 Excel 或 Excel Online 下运行?

    我正在编写一个 Office 加载项 以前称为 Apps for Office 我在用着office js在某些代码点中 我想检查应用程序是在 Excel 桌面软件 中运行还是在 Web 上运行 Excel Online 就像是 if Of
  • 如何为 Amazon S3 存储桶配置 SSL

    我使用 Amazon S3 存储桶通过 NET 应用程序上传和下载数据 现在我的问题是 我想使用 SSL 访问我的 S3 存储桶 是否可以为 Amazon s3 存储桶实施 SSL 您可以通过 SSL 访问您的文件 如下所示 https s
  • Firebase Cloud Messaging 开发和发布简介

    我最近从 Google Cloud Messaging 切换到 Firebase Cloud Messaging 对于 GCM 我必须选择沙箱选项 正如这里所描述的 https developers google com cloud mes
  • 使用 Google App Engine 实现“开头为”和“结尾为”查询

    我想知道是否有人可以提供一些指导 指导我如何使用 Python 对数据存储模型实现开头或结尾查询 在伪代码中 它的工作原理类似于 查询属性 P 以 X 开头的所有实体 A or 查询属性 P 以 X 结尾的所有实体 B 谢谢 马特 您可以使
  • 如何从服务器优雅地关闭套接字

    在服务器端 我试图优雅地关闭连接的套接字 我知道套接字上事件的正确顺序应该是 使用 SocketShutdown Send 选项关闭套接字 循环 等待 直到套接字接收返回 0 字节 套接字关闭 我有几个问题 如果 Socket Receiv
  • 使用连接字符串的 DocumentDB .Net 客户端

    我检查了 MSDN on DocumentDB for Net here 并找到了 3 个有效的构造函数 然而 它们都没有使用连接字符串 这对我来说听起来很奇怪 是否真的没有办法用连接字符串而不是端点 authKey组合来实例化客户端 或者
  • Spring Oauth2 Client,自动刷新过期的access_token

    让我解释一下我的用例 我需要有一个 spring boot oauth2 客户端应用程序 不是资源服务器 因为我们已经有一个单独的资源服务器 另外我还有以下要求 对于每个向资源服务器发出的请求 我们需要发送 id token 通过自定义re
  • 使用python ElementTree的itertree函数并将修改后的树写入输出文件

    我需要解析一个非常大 40GB 的 XML 文件 从中删除某些元素 然后将结果写入新的 xml 文件 我一直在尝试使用 python 的 ElementTree 中的 iterparse 但我对如何修改树然后将生成的树写入新的 XML 文件