Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python xml:从iterparse元素获取父属性_Python_Xml_Numpy_Xml Parsing - Fatal编程技术网

Python xml:从iterparse元素获取父属性

Python xml:从iterparse元素获取父属性,python,xml,numpy,xml-parsing,Python,Xml,Numpy,Xml Parsing,我有一个很大的XML文件,其中包含如下条目 <data num_entries="1000000000"> <item value="3.1324213213"></item> <item value="6.2432343213"></item> <!-- ... --> </data> 这是可行的,但速度相当慢,因为项是逐位分配的。我想使用周围数据块的num\u条目信息首先分配数组,例如 i

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

<data num_entries="1000000000">
   <item value="3.1324213213"></item>
   <item value="6.2432343213"></item>
   <!-- ... -->
</data>
这是可行的,但速度相当慢,因为
项是逐位分配的。我想使用周围
数据
块的
num\u条目
信息首先分配数组,例如

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
只有在所有
都被迭代之后才能访问父元素


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

您可以通过以下方式从xml的根目录中获取
num\u条目

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()

不是一种选择;文件太大,无法立即解析。我已经在行动中澄清了。啊,我现在明白了。如果没有
events=('start','end')
,解析器将只在末尾进行解析,它将在前后访问条目。正是我需要的。非常感谢。
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()