xml.etree.ElementTree
Python のモジュールの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
をラップできる唯一の場所はループの外側です。これは、次の XML 要素に進むことができないことを意味します。try
for
解決策の優先事項は次のとおりです。
- 例外を発生させる代わりに、必ずしも有効ではない Unicode 文字列を要素のテキストとして受け取ります。
- 無効な文字が置換または削除された有効な Unicode 文字列を受け取ります。
- 無効な文字を含む要素をスキップして、次の要素に進みます。
ElementTree
自分でコードを変更せずに、これらのソリューションを実装するにはどうすればよいですか?