gpt4 book ai didi

python - lxml事件解析大文件以仅提取一些数据

转载 作者:太空宇宙 更新时间:2023-11-03 19:01:16 24 4
gpt4 key购买 nike

我在这里看到了很多有关 lxml 解析的问题,虽然它们都非常有用,但有些问题特定于正在解析的文件的结构。

就我而言,我有一个如下所示的 xml:

<documents>
<document>
<id>123456</id>
<element name="name">
<value><![CDATA[john doe]]></value>
</element>
<element name="address">
<value><![CDATA[no name street]]></value>
</element>
</document>
</documents>

实际的 xml 有更多元素,但这只是为了举例。我的最终目的是将其中一些信息提取到 csv 中,以便得到以下结果:

id, name, address
123456,john doe,no name street

但是我的问题是解析文件以根据条件获取“value”元素内的值(如果父“元素”具有特定属性)。

因为我要解析的实际文件大约是 8GB,所以我认为最好利用 lxml 的 iterparse 来避免在内存中存储一​​棵大树。

这是我现在拥有的代码,当尝试检查下一个元素的文本是否“元素”的属性“名称”等于列表“属性”中指定的值时,我有点陷入困境“:

from lxml import etree

attributes = ("name", "address")
context = etree.iterparse("test.xml", tag="document")

for event, element in context:
for child in element:
if child.attrib.get("name") in attributes:
print child.getnext().text

感谢您的帮助!

最佳答案

它并不是真正的“下一个”,而是后代,所以我认为你可以再做一个循环。如果 value 始终是唯一的子元素,您可以这样做:

from lxml import etree

attributes = ("name", "address")
context = etree.iterparse("test.xml", tag="document")

for event, element in context:
for child in element:
if child.attrib.get("name") in attributes:
print next(c for c in child).text
element.clear() # clear the subtree from the memory

否则你可以在 if 中创建一个完整的 for 循环,有点像

if child.attrib.get("name") in attributes:
for subchild in child:
if subchild.tag == 'value':
print subchild.text

关于python - lxml事件解析大文件以仅提取一些数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16002635/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com