(回答我自己的问题)
您无法从异常中分辨出来,并且需要对驱动程序进行一些重写才能支持该功能。
代码在bson/__init__.py
. 如果要在 utf-8 中编码字符串抛出 UnicodeError,则有一个名为的函数_make_c_string
会引发。InvalidStringData
相同的函数用于作为字符串的键和值。
换句话说,在代码的这一点上,驱动程序不知道它是在处理键还是值。
有问题的数据作为原始字符串传递给异常的构造函数,但由于我不明白的原因,它不是来自驱动程序。
>>> bad['zzz'] = '0\x82\x05\x17'
>>> try:
... db.test.insert(bad)
... except bson.errors.InvalidStringData as isd:
... print isd
...
strings in documents must be valid UTF-8
但这并不重要:无论如何,您都必须查找该值的键。
最好的方法是迭代这些值,尝试用 utf-8 解码它们。如果UnicodeDecodeError
引发 a,则将值包装在 Binary 对象中。
有点像这样:
try:
#This code could deal with other encodings, like latin_1
#but that's not the point here
value.decode('utf-8')
except UnicodeDecodeError:
value = bson.binary.Binary(str(value))