我目前正在尝试解析一个包含多个 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 异常有关。
我仔细检查了文件是否一直被读取,直到它结束,似乎就是这种情况,因此,我假设文档变量直到那一刻才存在,就在抛出异常之前。
有没有办法在引发异常之前获取最后一次迭代的内容?