Последний элемент в xml не получен - PullRequest
0 голосов
/ 24 сентября 2011

Ниже у меня есть скрипт на python 3, который должен загружать XML-файл и разбивать его на более мелкие файлы по 500 штук в каждом.У меня две проблемы:

  1. последний элемент в исходном xml отсутствует в разделенных файлах
  2. , если исходный xml имел длину 1000 элементов, он создаст третий пустой xmlфайл.

Может кто-нибудь сказать мне, где может быть такая ошибка в моем коде, чтобы вызвать эти симптомы?

import urllib.request as urllib2
from lxml import etree

def _yield_str_from_net(url, car_tag):

    xml_file = urllib2.urlopen(url)
    for _, element in etree.iterparse(xml_file, tag=car_tag):
        yield etree.tostring(element, pretty_print=True).decode('utf-8')
        element.clear()

def split_xml(url, car_tag, save_as):

    output_file_num = 1
    net_file_iter = _yield_str_from_net(url, car_tag)
    while True:
        file_name = "%s%s.xml" % (save_as, output_file_num)
        print("Making %s" % file_name)
        with open(file_name, mode='w', encoding='utf-8') as the_file:
            for elem_count in range(500):    # want only 500 items
                try:
                    elem = next(net_file_iter)
                except StopIteration:
                    return
                the_file.write(elem)
                print("processing element #%s" % elem_count)
        output_file_num += 1

if __name__ == '__main__':
    split_xml("http://www.my_xml_url.com/",
              'my_tag',
              'my_file')

1 Ответ

1 голос
/ 24 сентября 2011

Второе - не ошибка, но по замыслу. После считывания 1000 элементов итератор еще не знает, что больше нет элемента, и поэтому продолжает цикл while True.

Было бы замечательно, если бы итераторы имели hasNext, тогда вы могли бы заменить его на while hasNext, чтобы преодолеть эту проблему. К сожалению, в Python такого нет.

По первому вопросу: в настоящее время я не вижу в вашем коде ничего, объясняющего эту проблему.

...