问题标签 [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.
python - 使用 lxml 和 iterparse 获取子元素
我正在尝试编写一个解析算法来有效地从 xml 文档中提取数据。我目前正在基于元素和子元素滚动文档,但想改用 iterparse。一个问题是我有一个元素列表,当找到这些元素时,我想从中提取子数据,但似乎使用 iterparse 我的选项是基于一个元素名称进行过滤,或者获取每个元素。
示例 xml:
代码示例:
python - 为什么 elementtree.ElementTree.iterparse 使用这么多内存?
我正在使用 elementtree.ElementTree.iterparse 来解析一个大 (371 MB) xml 文件。
我的代码基本上是这样的:
我的问题有两个:
首先 - 我需要 A 和 B(参见代码片段注释)吗?有人告诉我 root.clear() 会清除不必要的子项,因此不会占用内存,但这是我的观察结果:在内存消耗方面,使用 B 而不是 A 与既不使用相同(使用任务管理器绘制)。仅使用 A 似乎与同时使用两者相同。
第二 - 为什么这仍然消耗这么多内存?当程序运行时,它在接近尾声时使用了大约 100 MB 的 RAM。
我认为它与outf有关,但为什么呢?它不只是写入磁盘吗?如果它在 outf 关闭之前存储该数据,我该如何避免这种情况?
其他信息:我在 Windows 上使用 Python 2.7.3。
python - ElementTree iterparse 需要多长时间?
在回答另一个问题时,有人向我展示了以下教程,其中作者声称已使用 iterparse 在 3 秒内解析约 100 MB 的 XML 文件:
http://eli.thegreenplace.net/2012/03/15/processing-xml-in-python-with-elementtree/
我正在尝试解析一个 ~90 MB XML 文件,并且我有以下代码:
这大约需要 30 秒……甚至与我使用类似大小的文件、类似的算法和相同的包阅读的教程中报告的数量级不同。
有人可以告诉我我的代码可能有什么问题,或者我的情况和本教程之间可能没有注意到哪些差异?
我正在使用 Python 2.7.3。
附录:
我也在使用一台相当强大的机器,以防有人认为可能是它。
python - 在 Python 中解析巨大的、编码错误的 XML 文件
我一直在研究解析外部 XML 文件的代码。其中一些文件很大,高达千兆字节的数据。不用说,这些文件需要被解析为流,因为将它们加载到内存中效率太低,并且经常导致 OutOfMemory 麻烦。
我使用了 miniDOM、ElementTree、cElementTree 库,目前正在使用 lxml。现在我有一个工作的、非常节省内存的脚本,使用lxml.etree.iterparse
. 问题是我需要解析的一些 XML 文件包含编码错误(它们宣传为 UTF-8,但包含不同编码的字符)。使用lxml.etree.parse
时可以通过使用recover=True
自定义解析器的选项来修复它,但iterparse
不接受自定义解析器。(另见:这个问题)
我当前的代码如下所示:
iterparse
遇到错误字符时出错(在这种情况下,它是 a ^Y
):
我什至不想解码这些数据,我可以放弃它。但是我不知道有什么方法可以跳过该元素 - 我尝试过context.next
并continue
在 try/except 语句中。
任何帮助,将不胜感激!
更新
一些附加信息:这是 iterparse 失败的行:
<description><![CDATA:[musea de la photographie fonds mercator. Met meer dan 80.000 foto^Ys en 3 miljoen negatieven is het Muse de la...]]></description>
根据 etree,错误发生在 bytes 0x19 0x73 0x20 0x65
。
根据 hexedit,19 73 20 65
转换为 ASCII.s e
在.
这个地方应该是一个撇号(foto's)。
我还发现了这个问题,它没有提供解决方案。
python - 为什么 lxml.etree.iterparse() 会占用我所有的内存?
这最终会消耗我所有可用的内存,然后进程被杀死。我尝试将标签从schedule
“更小”标签更改为“更小”的标签,但这并没有什么不同。
我在做什么错/如何处理这个大文件iterparse()
?
我可以很容易地把它切成小块并处理它,但这比我想要的更难看。
python - 在命名空间声明不一致的文档上使用 iterparse,然后使用 xpath
我需要整理一段代码,将可能很大的 XML 文件解析为自定义 Python 对象。思路大致如下:
问题是,有些文档有命名空间声明,有些则没有。这意味着在上面的代码中,tag='Foo'
和xpath
部分都不起作用。
现在我一直在忍受丑陋的东西
但这太糟糕了,即使它工作正常,我也想把它做好。(我想它也应该更慢。)
有没有办法编写理智的代码来解释这两种情况iterparse
?现在我只能想到捕获start-ns
和end-ns
事件并更新“状态保持”变量,我必须将其传递给循环中调用的函数来完成工作。然后该函数将xpath
相应地构造查询。这是有道理的,但我想知道是否有更简单的方法。
PS我显然已经尝试过四处搜索,但还没有找到一个既可以使用也可以不使用命名空间的解决方案。我也会接受从 XML 中消除名称空间的解决方案,但前提是它不会在进程中将整个树存储在 RAM 中。
python - 由于随后的 .clear() 无法遍历孩子的孩子?
我正在尝试使用本教程的“事件驱动解析”部分中描述的模式。lxml
在我的代码中,我正在调用一个可以使用该iterchildren()
方法在元素上递归运行的函数。我将在这里使用两个嵌套循环进行说明。
这按预期工作:
输出是<Element d at 0x2df49b0>
。
但如果我.clear()
最后添加:
-- 它不打印任何东西。为什么会这样,我该怎么做才能解决这个问题?
笔记:
- 我可以跳过
iterchildren
并执行for c in elem
orfor c in list(elem)
,效果相同。 - 我需要使用迭代方法来保持低内存使用率。
在实际用例中,我正在使用属性进行元素查找:
/li>
我想解释一下如何clear
在处理内部元素之前设法擦除它们,以及如何在需要处理祖先时将它们保存在内存中。
python - ElementTree 迭代解析策略
我必须处理足够大(最大 1GB)的 xml 文档并用 python 解析它们。我正在使用iterparse()函数(SAX 样式解析)。
我关心的是以下,假设你有一个这样的 xml
问题是,当然要知道我何时获得姓氏(如辛普森一家)以及何时获得该家庭成员之一的姓名(例如荷马)
到目前为止我一直在做的是使用“开关”,它会告诉我我是否在“成员”标签内,代码看起来像这样
这很好用,因为输出是
我担心的是,对于这个(简单的)示例,我必须创建一个额外的变量来知道我在哪个标签(on_members_tag)中,想象一下我必须处理的真正的 xml 示例,它们有更多的嵌套标签。
另请注意,这是一个非常简化的示例,因此您可以假设我可能面临一个带有更多标签、更多内部标签的 xml,并试图获取不同的标签名称、属性等。
所以问题是。我在这里做一些非常愚蠢的事情吗?我觉得必须有一个更优雅的解决方案。
python - 如何在使用 cElementTree.iterparse() 时跳过引发错误的节点
我正在尝试解析一个非常大的 XML 文件并使用小写字母并删除标点符号。问题是,当我尝试使用cET parse function
for big files 解析此文件时,有时会遇到格式错误的标签或字符,这会引发syntax error
:
注意:我几乎不可能读取文件,所以我看不出问题出在哪里。
我怎样才能跳过或解决这个问题?