问题标签 [iterparse]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
121 浏览

python - 为什么 ElementTree.iterparse 有时会不完整地检索 XML 元素?

我正在解析一个太大而无法完全加载到内存中的 XML 文件,所以我使用 anxml.etree.ElementTree.iterparse来解析它。

我遇到的问题是,有时,当我从迭代器中检索一个元素时,我发现我的 XML 文件中存在的一些信息被 ElementTree 忽略了。这是预期的行为吗?

一个例子

假设我正在使用xml.etree.ElementTree.iterparse迭代器解析上面的 XML 片段。在给定的实例中,迭代器给了我 element elem,它指向 XMLcar元素。

然后,我执行xml.etree.ElementTree.dump(elem)以查看elem捕获实际 XML 数据的效果,我得到:

现在,请注意第二个part元素的名称是如何未被捕获的。为什么会发生这种情况,我该如何解决?

0 投票
0 回答
76 浏览

python - LXML etree.iterparse() 中的编码错误,但 etree.parse() 中没有

我正在尝试使用 LXML 解析 ~200MB XML 文件。我愚蠢地做etree.parse(xml_path),没有任何encoding参数作为参数,然后使用iterwalk()迭代一些子节点,认为它会降低内存消耗。它奏效了,我可以解析整个 XML 文件,尽管速度很慢。然后我意识到在做etree.parse(xml_path)时,整个文件被加载到内存中,所以做iterparse()iterwalk()之后没有意义。

所以现在,我试图直接etree.iterparse(xml_path)在同一个文件上做,但我得到了

我尝试同时使用encoding='utf-8'encoding='ISO-8859-1'作为参数,iterparse()但错误仍然存​​在。我的 XML 文件指出编码是'ISO-8859-1'.

TL;DR: etree.parse()工作但etree.iterparse()由于编码错误而失败。我浏览了有关 iterparse() 编码的所有 SO 答案,但似乎还没有人遇到过这个问题。

0 投票
1 回答
49 浏览

python - 如何将 xmlTree iterparse 应用于嵌套的 XML 集

我正在尝试复制本教程中的示例,但将 iterparse 与 elem.clear() 一起使用。

XML 示例:

预期的输出是这样的: 桌子 我正在尝试使用以下代码对其进行解析:

我的问题是我得到了更多额外的行,其中 str6 为空字段。可能,我在这里有嵌套问题。请帮忙。错误示例(出现 0 个字段): 在此处输入图像描述

0 投票
2 回答
107 浏览

python - 处理大型 xml 文件。只有根树子属性是相关的

我是 xml 和 python 的新手,我希望我能正确表达我的问题:

我有大小为 1 GB 的 xml 文件。文件如下所示:

为了快速分析,我想获取作为根元素子元素的步骤的名称和结果。我不关心的是很多嵌套元素。

我已经尝试过以下操作:

在这里我得到一个内存错误,因为文件太大了

然后我尝试了:

这有效,但真的很慢。我猜它会遍历所有元素,这需要很长时间。

然后我找到了一个看起来像这样的解决方案:

但这仅打印第一步的属性。

有没有办法加快工作解决方案?由于我对这些东西很陌生,我希望有一个完整的示例或参考,我可以通过一个示例自己弄清楚。

0 投票
1 回答
227 浏览

python - 如何在 Python 中迭代解析大型 XML 文件?

我需要处理一个大约 8Gb 的大 .XML 文件。文件结构(简化)类似于以下内容:

我需要提取 RecordType1 和 RecordType2 元素中的一些子元素。有条件决定哪些记录项需要处理,哪些字段需要提取。单个 RecordItems 不超过 120k(有些有大量文本数据,我不需要)。

这是代码。函数 get_all_records 接收以下输入: a) XML 文件的路径;b) 记录类别(“RecordType1”或“RecordType2”);c) 选择什么名称组件

我已经尝试过记录的数量,代码在大约一分钟内很好地处理了 100k RecordItems(仅 Type1,到达 Type2 需要太长时间)。试图处理更多的记录(我拿了一百万),最终导致 ElementTree.py 中的 MemoryError。所以我猜尽管有 root.clear() 声明,但没有释放内存。

一个理想的解决方案是一次读取一个 RecordItems,进行处理,然后从内存中丢弃,但我不知道如何做到这一点。从 XML 的角度来看,两个额外的元素层(TopLevelElement 和 Records)似乎使任务复杂化。我是 XML 和相应 Python 库的新手,因此非常感谢详细解释!

0 投票
0 回答
41 浏览

python - 优化大型 XML 文件的 iterparse 代码

我希望使用 Python 代码解析一个大型 XML 文件(~9 GB)。我知道已经有很多关于这个主题的问题,从我收集到的信息来看,解析这些大文件的推荐方法是iterparse使用xml.etree.ElementTree. 下面给出的是我的代码在解析数据时的样子,

现在已经运行了大约 6 个小时,看起来我没有取得太大进展。这种大小的文件正常吗?有什么方法可以改进我的代码吗?

我看到的另一种可能性如下所示(清除每个元素而不是根元素),

我也没有太多运气。

我能做些什么来改善这一点?我也对全新的方法持开放态度。

0 投票
0 回答
34 浏览

python - 在使用 xml.etree 解析 XML 时有效地迭代特定标签

我正在解析一个大小约为 9 GB 的非常大的 XML 文件。我已经尝试过这种.iterparse方法,根据我收集到的信息,这是完成这项任务的推荐方法。但是,这似乎需要太长时间。现在,我正在尝试实现一种多处理方法,尝试在不同的进程中解析感兴趣的元素。

我相信过去可以做到.iterparse('path_to_file.xml, events=("start", "end"), tag='some_tag),但看起来不再支持了。

所以,我想出的方法是这样的,

有没有更好的方法来解决这个问题?据我所知,这是一个内存密集型操作。

如果没有其他方法可以做到这一点,有没有办法在使用这种方法时清除内存?就像我们element.clear()使用.iterparse?

0 投票
0 回答
46 浏览

python - 解析 XML 文件时可能存在内存泄漏?

我有一个运行时间很长的脚本,它解析一个大的 XML 文件(~9GB)并将数据分块插入到数据库中。就是这个样子

在这里,我正在寻找具有特定标签的元素并对其进行解析。现在,我几乎没有其他函数可以解析同一文件中的不同标签。代码几乎相同,只是稍作修改。我实际上想并行运行这些,但即使我按顺序运行它们,我也面临一个问题。

我的第一个函数运行良好且不消耗太多资源,但是,当我执行第二个函数时,内存消耗量猛增,我的应用程序失败了。这没有任何意义,尤其是因为我正在通过我的第一个函数解析具有最多数据的元素。我的第二个功能可以被认为是这样的,

请注意,给上述iterparse函数的标签是不同的。

这可能是什么原因?是否可能存在内存泄漏?我想不出别的了。我该如何解决这个问题?

0 投票
2 回答
59 浏览

python-3.x - 跳过大型 XML 文件中的元素(python 3)

我是 xml 解析的新手,我一直试图找出一种跳过父元素内容的方法,因为有一个嵌套元素在其文本属性中包含大量数据(我无法更改此文件的方式生成)。这是 xml 的示例:

我已经尝试了 lxml.iterparse 和 xml.sax 实现来尝试解决这个问题,但没有骰子。这些是我在搜索中找到的大部分答案:

  1. 在 iterparse 中使用 tag 关键字。

    这不起作用,因为尽管 lxml 在后台清理了元素,但元素中的大文本仍然被解析到内存中,所以我得到了很大的内存峰值。

  2. 如果找到该元素的开始事件,则创建一个将其设置为 True 的标志,然后在解析中忽略该元素。

    这不起作用,因为元素在结束事件时仍被解析到内存中。

  3. 在到达特定元素的结束事件之前中断。

    当我到达元素时,我不能只是打破,因为有多个这些元素需要特定的子数据。

  4. 这是不可能的,因为流解析器仍然有一个结束事件并生成完整的元素。

    ... 好的。

我目前正在尝试直接编辑 GzipFile 发送到 iterparse 的流数据,希望它甚至不知道该元素存在,但我遇到了问题。任何方向将不胜感激。