gpt4 book ai didi

python - xml:从 iterparse 元素获取父属性

转载 作者:太空宇宙 更新时间:2023-11-04 00:24:43 24 4
gpt4 key购买 nike

我有一个很大的 XML 文件,其中包含如下条目

<data num_entries="1000000000">
<item value="3.1324213213"></item>
<item value="6.2432343213"></item>
<!-- ... -->
</data>

(实际上,有多个 data 条目,它们在 XML 树中更深,但让我们保持简单。)

我想用 Python 读取这个文件并将所有 item 放入一个 numpy 数组中。该文件太大,ET.parse() 不是一个选项。为了避免内存阻塞,我将 iterparse()elem.clear() 一起使用

import xml.etree.cElementTree as ET

items = []
for event, elem in ET.iterparse(filename):
if elem.tag == 'item':
items.append(float(elem.attrib['value']))
elem.clear()
items = numpy.array(items)

这可行,但速度相当慢,因为 items 是逐位分配的。我想使用周围 data block 的 num_entries 信息首先分配数组,即类似

items = None
k = 0
for event, elem in ET.iterparse(filename):
if elem.tag == 'item':
if items is None:
num_entries = get_num_entries_somehow()
items = numpy.empty(num_entries)
items[k] = float(elem.attrib['value'])
k += 1
elem.clear()

不幸的是,iterparse 仅在 所有 item 被迭代后才到达父元素。

如何使用 iterparse() 访问父属性?

最佳答案

您可以通过以下方式从 xml 的根目录中获取 num_entries:

tree = ET.ElementTree(file=filename)
root = tree.getroot()
print(root.attrib.get('num_entries'))

^ 上面的方法会一次解析所有的树,这样不好。

如何启用start 事件?

for event, elem in ET.iterparse(filename, events=('start', 'end')):
if elem.tag == 'data' and event == 'start':
print(elem.attrib['num_entries'])
if elem.tag == 'item' and event == 'start':
items.append(float(elem.attrib['value']))
elem.clear()

关于python - xml:从 iterparse 元素获取父属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47906792/

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