我正在使用 Pythonxml.etree.ElementTree
模块的iterparse()
方法读取一个巨大的(多千兆字节)XML 文件。问题是在某些 XML 文件的文本中偶尔会出现 Unicode 错误(或者至少 Python 3 认为是 Unicode 错误)。我的循环是这样设置的:
import xml.etree.ElementTree as etree
def foo():
# ...
f = open(filename, encoding='utf-8')
xmlit = iter(etree.iterparse(f, events=('start', 'end')))
(event, root) = next(xmlit)
for (event, elem) in xmlit: # line 26
if event != 'end':
continue
if elem.tag == 'foo':
do_something()
root.clear()
elif elem.tag == 'bar':
do_something_else()
root.clear()
# ...
当遇到带有 Unicode 错误的元素时,我收到以下回溯错误:
Traceback (most recent call last):
File "<path to above file>", line 26, in foo
for (event, elem) in xmlit:
File "C:\Python32\lib\xml\etree\ElementTree.py", line 1314, in __next__
self._parser.feed(data)
File "C:\Python32\lib\xml\etree\ElementTree.py", line 1668, in feed
self._parser.Parse(data, 0)
UnicodeEncodeError: 'utf-8' codec can't encode character '\ud800' in position 16383: surrogates not allowed
由于错误发生在for
循环迭代之间,我可以包装try
块的唯一位置是for
循环之外,这意味着我无法继续下一个 XML 元素。
我的解决方案优先级如下:
- 接收一个不必要有效的 Unicode 字符串作为元素的文本,而不是引发异常。
- 接收替换或删除无效字符的有效 Unicode 字符串。
- 跳过带有无效字符的元素并继续下一个。
我如何在不亲自修改ElementTree
代码的情况下实现这些解决方案?