我目前正在尝试解析一个大文件,其中包含多个串联的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异常有关。
我仔细检查了文件的读取过程,直到文件结束为止,而且似乎是这种情况,因此,我认为文档变量一直存在,直到抛出异常之前。
有没有办法在引发异常之前获取上一次迭代的内容?