Ich habe diesen einfachen Code aus einer Mongo Datenbank zu extrahieren:muss str sein, nicht Bytes | 'Str' hat kein Attribut 'decode'
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)
es so laufen, wird mir
AttributeError: 'str' object has no attribute 'decode'
Also ... es ist ein str Objekt, dann? aber wenn ich die decode entfernen, erhalte ich
TypeError: must be str, not bytes
und es ist nicht wie es etwas gibt, das Drucken, so muss es auf dem ersten Schlüssel fehlerhaft sein? aber ... kann der erste Schlüssel weder str noch Bytes sein ??? Wie kann ich das ausdrucken?
EDIT Tests mit bündig:
for key, value in document.items() :
sys.stdout.write("1")
sys.stdout.flush()
sys.stdout.write(key.decode('utf-8'))
sys.stdout.flush()
änderte ich das zu, dass, immer den Fehler
~/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
Sie sind auf Python 3.x. Strings haben keine 'Decodier'-Methode. Wenn Sie ein Byte-Objekt aus einer Zeichenfolge benötigen, sollte 'encode' ausreichen. –
Es gibt wahrscheinlich einige Bytes und einige Str-Schlüssel. Sie könnten 'print (list (document.keys())' versuchen, um zu sehen, welche Art von Schlüsseln es gibt. – poke
Da Sie 'sys.stdout.write' verwenden, sollten Sie eine 'sys.stdout.flush()' hinzufügen Danach wird die Ausgabe sofort aktualisiert, so dass Sie feststellen können, ob Ihre beiden Runs (mit und ohne Dekodierung) eine andere Anzahl von Schlüsseln ergeben (wahrscheinlich auch) – poke