如何防止Python生成器函数省略最后一项?

时间:2018-12-20 00:10:24

标签: python xml-parsing

我目前正在尝试解析一个大文件,其中包含多个串联的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的文档...成功!

     

为项目2添加xml声明标签...成功!

     

发送批次2 ...您已创建项目文件#2!

     

阅读项目3:成功!

     

重置项目3的文档...成功!

     

为项目3添加xml声明标记...成功!

     

发送批次3 ...您已创建项目文件#3!

     

阅读项目4:成功!

     

正在重置项目4的文档...成功!

     

为项目4添加xml声明标记...成功!

     

生成器功能找不到更多项!

如您所见,没有为项目4创建文件。我几乎可以肯定,这与抛出StopIteration异常有关。

我仔细检查了文件的读取过程,直到文件结束为止,而且似乎是这种情况,因此,我认为文档变量一直存在,直到抛出异常之前。

有没有办法在引发异常之前获取上一次迭代的内容?

0 个答案:

没有答案
相关问题