(私自身の質問に答える)
例外から判断することはできません。その機能をサポートするには、ドライバーを書き直す必要があります。
コードは にあり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 でデコードすることです。aUnicodeDecodeError
が発生した場合、値を 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))