pymongo错误:bson.errors.InvalidBSON:' utf8'编解码器不能解码位置25中的字节0xa1:无效的起始字节

时间:2016-03-30 16:38:10

标签: python mongodb pymongo

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

当我使用pymongo解决程序时,我遇到了麻烦。

  

文件" D:\ Python27 \ lib \ site-packages \ pymongo-3.2.1-py2.7-win-amd64.egg \ pymongo \ cursor.py",第1097行,下一步     文件" D:\ Python27 \ lib \ site-packages \ pymongo-3.2.1-py2.7-win-amd64.egg \ pymongo \ cursor.py",第1039行,在_refresh     文件" D:\ Python27 \ lib \ site-packages \ pymongo-3.2.1-py2.7-win-amd64.egg \ pymongo \ cursor.py",第903行,在__send_message中     文件" D:\ Python27 \ lib \ site-packages \ pymongo-3.2.1-py2.7-win-amd64.egg \ pymongo \ helpers.py",第133行,在_unpack_response中   bson.errors.InvalidBSON:' utf8'编解码器不能解码位置25中的字节0xa1:无效的起始字节

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

我走进pymongo找出原因。我发现问题可能由以下代码引起

    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)}

在pymongo helper.py 133行 在bson.decode_all中,它显示了解码失败导致的问题,关于&#39; oid&#39; oid&#39;是mongo中的_id。然后我复制文档并使用新的_id制作相同的文档,然后我成功获取文档。

如何通过&#34;解决任务中的任务问题:&#34;风格。

使用的pymongo版本:3.2.1

3 个答案:

答案 0 :(得分:3)

我最近有类似的错误消息,很难找到它的帮助。

快速解决

我解决了我的问题,降低了3.0以下的pymongo版本。 changelog of pymongo在版本3.0中宣传“重写的纯Python BSON实现”。我发现新的实现在以BSON格式序列化时无法管理python utf8和unicode编码。

分析

它接收到错误来自您的数据库中的无效bson ...类似于this。也许你应该发布你的错误there

答案 1 :(得分:3)

我正在使用Python 3.6,pymongo 3.4.0。

根据文档,您可以使用'with_options'方法克隆集合,这对我来说很有用:

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

答案 2 :(得分:3)

您需要将unicode_decode_error_handler参数传递给MongoClient并至少使用pymongo 3.5.1。

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)

看起来像是&#39;忽略&#39;在Python 2.7上默认设置,但在Python 3.6.1中你必须自己完成。这将忽略Unicode错误并让光标继续迭代,pymongo将尽力重建JSON数据。