Python XML Element Tree Разбирает большой документ, возвращает подмножество - PullRequest
0 голосов
/ 30 сентября 2019

У меня большой документ с элементами XML на немецком языке, root iter возвращает только подмножество документа

root.iter ('tu') находит только 82

import logging
import xml.etree.cElementTree as ET
class Extractor(object):
    def _get_iter(self, filename: str):
        with open(filename) as objects:
            context = ET.iterparse(objects, events=("start", "end"))

            index, (event, root) = next(enumerate(context))

            return root.iter('tu')

    def get_objects(self, filename: str, limit=-1):
        found = sum(1 for _ in self._get_iter(filename))
        logging.getLogger(__name__).info('found: {}'.format(found))

// found is 82, actual number is millions

alignments = extractor.get_alignments('data/file.tmx', 100000)

обновление: Пример файла tmx: https://pastebin.com/kUFMMjck

обновление: Решено с помощью события и tagname = tu, я полагаю, что это некорректное поведение с root.iter ()

1 Ответ

0 голосов
/ 30 сентября 2019

root.iter ('tagname') ведет себя неожиданно, он не работает как ожидаемый итератор и, очевидно, готовит документ.

Решение -

class Extractor(object):
    def get_objects(self, filename: str):

        # get an iterable
        context = ET.iterparse(filename, events=("start", "end"))

        # turn it into an iterator
        context = iter(context)

        for event, elem in context:
            if event == "end" and elem.tag == "tu":
               # do something with elem
               elem.clear() # clears memory after doing something with the data

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...