重复使用 ElementTree.iterparse

Reuse ElementTree.iterparse

我有两个 xml 文件,一个包含产品信息,另一个包含产品描述。 我在多次重用 ElementTree.iterparse 时遇到问题,到目前为止还没有找到任何证据,如果它甚至可以多次迭代 ElementTree.iterparse 。 到目前为止,我已经通过将第二个 xml 的一部分读入 dict 来解决我的问题,这在内存中保存如此多的文本数据并不是很有效,但至少速度很快。 我的问题是可以多次迭代 ElementTree.iterparse 或扩展 ElementTree 以允许多次迭代吗?

正在阅读产品说明

desc_iter = ElementTree.iterparse(
    desc_filename, events=('start',))
row_id = 0
desc_list = {}
for event, elem in desc_iter:
    if event == 'start' and elem.tag == 'record':
        row_id = elem.attrib['num']
    if event == 'start' and elem.tag == 'DESCRIPTION' and elem.text is not None:
        desc_list[row_id] = elem.text
    elem.clear()

使用产品描述并遍历产品数据

    data_iter = ElementTree.iterparse(
        data_filename, events=('start', 'end'))
    result = copy.deepcopy(self.default_result)
    result['downloader_id'] = self.downloader_id
    for event, elem in data_iter:
        if event == 'start' and elem.tag == 'record':
            pass
            ....
        if event == 'end' and elem.tag == 'record':
            print(result)
            print('='*200)
            result = copy.deepcopy(self.default_result)
            result['downloader_id'] = self.downloader_id
        elem.clear()
    del data_iter

iterparse 方法 return 和 iterator,根据定义,当到达末尾时将关闭。

如果要多次读取数据,只有两种解决方案:

  1. 将数据存储在 listdict 中(您目前的解决方案)
  2. 每次都调用iterparse一次。

最后,如果你每次都寻找特定的信息,你可以使用像Element.find()

这样的方法