1

我目前正在尝试解析一个包含多个 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 异常有关。

我仔细检查了文件是否一直被读取,直到它结束,似乎就是这种情况,因此,我假设文档变量直到那一刻才存在,就在抛出异常之前。

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

4

0 回答 0