Как вы можете запретить функции генератора Python пропускать последний элемент? - PullRequest
0 голосов
/ 20 декабря 2018

В настоящее время я пытаюсь проанализировать большой файл, содержащий несколько файлов XML, соединенных внутри.В настоящее время я могу получить каждый элемент в допустимом формате XML, за исключением последнего.Я решил попробовать свою функцию, которая включает в себя только подмножество из 4 сцепленных XML-файлов.

Функция заключается в следующем:

def read_bulk_file(bulk_file): #better name pending
with open(bulk_file, 'r') as f:
    next(f)
    document = ''
    document += '<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n'
    n = 1
    for line in f:
        if '<?xml version=\"1.0\" encoding=\"UTF-8\"?>' in line:
            print('Sending batch ' + str(n) + '...', end='')
            yield document
            print('Success!')
            n += 1
            print('Resetting document for item ' + str(n) + '...', end='')
            document = ''
            print('Success!')
            print('Adding xml declaration tag for item ' + str (n) + '...', end='')
            document += '<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n'
            print('Success!')
        else:
            document += line

Сценарий, который я использую для запуска своей функции:

text_generator = read_bulk_file('./Data/test_xml.xml')
n = 1
while True:
    try:
        print('Reading Item #' + str(n) + ': ', end='')
        n += 1
        with open('./Data/results/item' + str(n-1) + '.xml', 'w') as o:
             o.write(next(text_generator))
        print('You have created item file #' + str(n-1) + '!')
    except StopIteration:
        print('Generator function didn\'t find more items!')
        break

Наконец, вывод в консоли:

Чтение Элемента # 1: Отправка пакета 1 ... Вы создали файл элемента # 1!

Чтение Пункт № 2: Успех!

Сброс документа для элемента 2 ... Успех!

Добавление тега объявления XML для элемента 2 ... Успех!

Отправка пакета 2 ... Вы создали файл элемента № 2!

Чтение Пункта № 3: Успех!

Сброс документа для пункта 3 ... Успех!

Добавление тега объявления xml для элемента 3 ... Успех!

Отправка пакета 3 ... Вы создали файл элемента № 3!

Чтение элемента № 4: Успех!

Сброс документа для элемента 4 ... Успех!

Добавление тега объявления XML для элемента 4 ... Успех!

Функция генератора не нашла больше элементов!

Как вы видите, файл не создан для элемента 4. Я почти уверен, что это связано со StopIteration.генерируется исключение.

Я дважды проверил, что файл читается до конца, и, похоже, так оно и было, и поэтому я предположил бы, что переменная документа существовала до этого момента,прямо перед исключением.

Есть ли способ получить содержимое последней итерации до возникновения исключения?

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