При разборе большого XML я использую генератор, который выдает экземпляр класса, мой скелет кода выглядит следующим образом:
class Hold:
def __init__(self, name, time, ...):
self.name = name
self.time = time
...
def xml_parser(xmlfile):
context = ET.iterparse(xmlfile, events=('start', 'end'))
holdPattern, other_classes = None, ...
number = 0
for event, elem in context:
if event == 'start':
# opening tag, initialize an object
if elem.tag == 'hold':
holdPattern = Hold(None, None, None, ...)
else:
# get all of the properties
if elem.tag == 'holdName':
holdPattern.name = elem.text
elif elem.tag == 'holdTime':
holdPattern.time = elem.text
...
# closing tag, end of the object
elif elem.tag == 'hold':
yield holdPattern
def insert_db(content):
for item in xml_parser(content):
if isinstance(item, Hold):
print(item.__dict__)
# manipulations with Hold
...
Вопрос - возможно ли держать 2 рядомобъекты при итерации внутри генератора?
Дело в том, что у меня есть объекты с геометрией линейной линии, которые строятся из 2 точек (1 точка из 1 объекта).Итак, мне нужно получить координаты Point объекта и координаты Point следующие ... Я пытался добавить его в список, но безуспешно: моя идея заключалась в добавлении item
к списку в def insert_db()
, но я получаю2 дублированных объекта ( вот похожий вопрос ).Мне до сих пор не ясно, как решить проблему.
Использование yield - это не мое дело? .. Мой XML-файл ~ 1 ГБ, и я не хотел бы перегружать мою систему