必须是str,而不是字节| 'str'没有属性'decode'

时间:2016-07-02 09:20:02

标签: python string mongodb python-3.x

我有这个简单的代码从mongo数据库中提取:

import sys
import codecs
import datetime
from pymongo import MongoClient

sys.stdout = codecs.getwriter('utf8')(sys.stdout)

mongo_db = "database"
collectionId = "coll name"

def main(argv):
        client = MongoClient("mongodb://localhost:27017")
        db = client[mongo_db]
        collection = db[collectionId]

        cursor = collection.find({})
        for document in cursor:
        #       if "content" in document:
        #            sys.stdout.write(
        #                    "|"+(document['content'] if document['content'] is not None else "")+"\n")
                for key, value in document.items() :
                        sys.stdout.write(key.decode('utf-8'))

if __name__ == "__main__":
    main(sys.argv)

像这样运行,让我

  

AttributeError:'str'对象没有属性'decode'

那么......那是一个str对象呢?但如果我删除解码,我会

  

TypeError:必须是str,而不是bytes

并且,它不像是打印任何东西,所以,它必须在第一个键失败?但是......第一个关键字既不是str也不是字节???我怎么打印这个?

使用flush进行EDIT测试:

                for key, value in document.items() :
                    sys.stdout.write("1")
                    sys.stdout.flush()
                    sys.stdout.write(key.decode('utf-8'))
                    sys.stdout.flush()

我将for更改为了,得到了错误

~/Desktop$ python3 sentimongo.py
Traceback (most recent call last):
  File "sentimongo.py", line 30, in <module>
    main(sys.argv)
  File "sentimongo.py", line 24, in main
    sys.stdout.write("1")
  File "/usr/lib/python3.4/codecs.py", line 374, in write
    self.stream.write(data)
TypeError: must be str, not bytes

1 个答案:

答案 0 :(得分:4)

sys.stdout = codecs.getwriter('utf8')(sys.stdout)

此行更改标准输出,因此它会执行与您通常看到的不同的操作。在Python 3中,您并不需要关心将事物转换为utf8,因为所有内容都已经是unicode字符串。

如果删除该行,写一个普通字符串(甚至打印一个字符串)应该可以正常工作。