2016-07-02 30 views
0

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 
+0

Sie sind auf Python 3.x. Strings haben keine 'Decodier'-Methode. Wenn Sie ein Byte-Objekt aus einer Zeichenfolge benötigen, sollte 'encode' ausreichen. –

+1

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

+0

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

Antwort

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

Diese Zeile ändert die Standardausgabe, so tut es verschiedene Dinge, als Sie normalerweise sehen. In Python 3 müssen Sie sich nicht wirklich darum kümmern, Dinge in utf8 zu konvertieren, da alles bereits eine Unicode-Zeichenfolge ist.

Wenn Sie diese Zeile entfernen, sollte das Schreiben einer normalen Zeichenfolge (oder sogar Drucken einer) funktionieren.

Verwandte Themen