Error de pymongo: bson.errors.InvalidBSON: el codec ‘utf8’ no puede decodificar el byte 0xa1 en la posición 25: byte de inicio no válido

tasks = list(self.collection.find().sort('_id',pymongo.DESCENDING).limit(1000)) 

Tuve un problema cuando uso pymongo para resolver un progtwig.

Archivo “D: \ Python27 \ lib \ site-packages \ pymongo-3.2.1-py2.7-win-amd64.egg \ pymongo \ cursor.py”, línea 1097, en el siguiente archivo “D: \ Python27 \ lib \ site-packages \ pymongo-3.2.1-py2.7-win-amd64.egg \ pymongo \ cursor.py “, línea 1039, en el archivo _refresh” D: \ Python27 \ lib \ site-packages \ pymongo-3.2.1 -py2.7-win-amd64.egg \ pymongo \ cursor.py “, línea 903, en el archivo __send_message” D: \ Python27 \ lib \ site-packages \ pymongo-3.2.1-py2.7-win-amd64. egg \ pymongo \ helpers.py “, línea 133, en _unpack_response bson.errors.InvalidBSON: el códec ‘utf8’ no puede decodificar el byte 0xa1 en la posición 25: byte de inicio no válido

 tasks =self.collection.find().sort('_id',pymongo.DESCENDING).limit(1000) for task in tasks: #If i use this way,it will also touch this problem task = self.collection.find_one()#It would do so,too 

Entro en pymongo para averiguar la razón. Encuentro que el problema puede deberse a los códigos de seguimiento.

  result = {"cursor_id": struct.unpack("<q", response[4:12])[0], "starting_from": struct.unpack("<i", response[12:16])[0], "number_returned": struct.unpack("<i", response[16:20])[0], "data": bson.decode_all(response[20:], codec_options)} 

en pymongo helper.py 133 línea en bson.decode_all muestra el problema porque la deencoding fallida de ‘oid’ , ‘oid’ es el _id en mongo. Luego copio el documento y hago un mismo documento con un nuevo _id, luego Tengo éxito conseguir el documento.

¿Cómo puedo resolver el problema con el estilo “para tareas en tareas:”?

Versión de pymongo utilizada: 3.2.1.

Recientemente tuve un mensaje de error similar, y es bastante difícil encontrar ayuda al respecto.

Resolución rápida

Resolví mi problema degradando la versión de pymongo en 3.0. El registro de cambios de pymongo anuncia “Una implementación de Python BSON pura y reescrita” en la versión 3.0. Descubrí que la nueva implementación tiene problemas para administrar Python utf8 y la encoding Unicode al serializar en formato BSON.

Analizando

Parece que el error proviene de un bson no válido de su base de datos … similar a esto . Tal vez usted debería publicar su error allí .

Estoy usando Python 3.6, pymongo 3.4.0.

De acuerdo con la documentación, puedes clonar una colección con el método ‘with_options’, que es el truco para mí:

  col_article = col_article.with_options(codec_options = bson.CodecOptions(unicode_decode_error_handler="ignore")) 

Debe pasar el argumento unicode_decode_error_handler a MongoClient y usar pymongo 3.5.1 al menos.

 import pymongo import json from pymongo import MongoClient if __name__ == '__main__': client = MongoClient( host="whatever_your_host_is", maxPoolSize=50, unicode_decode_error_handler='ignore' ) my_db=client['my_db'] collection=my_db['my_collection'] cursor = collection.find({"whatever": "some_stuff"}) for document in cursor: print(document) 

Parece que ‘ignorar’ está configurado de forma predeterminada en Python 2.7, pero en Python 3.6.1 tienes que hacerlo tú mismo. Esto ignorará los errores de Unicode y permitirá que el cursor continúe iterando, pymongo intentará hacer todo lo posible para reconstruir los datos JSON.