简体   繁体   中英

must be str, not bytes | 'str' has no attribute 'decode'

I have this simple code to extract from a mongo database:

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)

running it like this, gets me

AttributeError: 'str' object has no attribute 'decode'

So... it's a str object, then? but if I remove the decode, I get

TypeError: must be str, not bytes

and, it's not like it's printing anything, so, it must be failing at the first key? but... can the first key be neither str nor bytes??? how can I print this?

EDIT testing with flush:

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

I changed the for to that, getting the error

~/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
sys.stdout = codecs.getwriter('utf8')(sys.stdout)

This line changes the standard output, so it does different things than you normally see. In Python 3 you don't really need to care about converting things to utf8 since everything already is a unicode string.

If you remove that line, writing a normal string (or even printing one) should work fine.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM