Kann nicht drucken, Zeichen '\u2019' in Python-aus JSON-Objekt
Als ein Projekt, um mir zu helfen, lernen, Python, mache ich eine CMD-viewer von Reddit mit der json-Daten (zum Beispiel www.reddit.com/all/.json). Wenn bestimmte Beiträge zeigen, und ich versuche zu drucken (das ist, was ich annehme, die Ursache der Fehler), bekomme ich diesen Fehler:
Traceback (most recent call last):
Datei "C:\Users\nsaba\Desktop\reddit_viewer.py", line 33, in
print ( "%d.... (%d) %s\n" % (i+1, obj['data']['score'], obj['data']['title']))
Datei "C:\Python33\lib\encodings\cp437.py", line 19, in encode
zurück codecs.charmap_encode(input,selbst.Fehler,encoding_map)[0]
UnicodeEncodeError: 'charmap' codec can T encode character '\u2019' in position
32: Charakter-Karten zu
Hier ist, wo ich die Daten zu verarbeiten:
request = urllib.request.urlopen(url)
content = request.read().decode('utf-8')
jstuff = json.loads(content)
Die Linie, die ich verwenden, um die Daten zu drucken, wie aufgeführt in der oben genannten Fehler:
print ( "%d. (%d) %s\n" % (i+1, obj['data']['score'], obj['data']['title']))
Kann jemand empfehlen, wo ich vielleicht falsch läuft?
- Das problem fast hat sicherlich nichts mit JSON, oder mit irgendetwas anderem in Ihrem code. Probieren Sie es einfach
print('\u2019')
und sehen Sie, wenn Sie die gleichen Fehler. Wenn ja, das problem ist, dass dein terminal ("DOS-box") ist nicht eingestellt die Unicode-Ausgabe richtig, und das ist, was Sie brauchen, um zu beheben. - Ja, du hast Recht. Der Grund für die zusätzlichen Daten, denn ich habe gelernt, Fragen zu stellen angesichts der Informationen, die ich habe, und nicht darüber, was ich denke, es könnte sein.
- Aber man sollte die post die minimale vollständiges Beispiel, das dein problem. Das ist es, was ein SSCCE ist alles über. Wenn
print('\u2019')
ist ausreichend, um nachzuweisen, dass es, mehr kompliziertes Beispiel wird nur dazu führen, dass Menschen auf Wildgans Verfolgungsjagden. Wenn Sie befürchten, die Menschen könnten sich Fragen: "Warum würden Sie wollen, drucken Sie dieses Zeichen?", dann können Sie den Kontext, der es erklärt... aber trotzdem führen die mit dem eigentlichen problem. - Auch, wenn Sie haben ein problem mit Python 3, vor allem, wenn es über etwas, das ein major-Wechsel von Python 2 (wie Unicode-Druck) verwenden Sie den python-3.x-tag. Ansonsten, eine Menge Leute werden geben Sie eine Python-2.x-spezifische Antwort (wie in der Tat, zwei Menschen haben hier...).
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es ist fast sicher, dass Sie problem hat nichts zu tun mit dem code, den Sie gezeigt haben, und kann reproduziert werden in einer Zeile:
Wenn Ihr terminal-Zeichensatz nicht verarbeiten kann U+2019 (oder wenn Python ist verwirrt darüber, was Zeichensatz Ihres Terminals verwendet), es gibt keinen Weg, um es auszudrucken. Es ist egal, ob es darum geht, die aus JSON oder sonst irgendwo.
Dem Windows terminal (aka "DOS-Eingabeaufforderung" oder "cmd-Fenster") ist in der Regel so konfiguriert, für die Sie einen Zeichensatz wie cp1252, die kennt nur 256 110000 Zeichen, und es gibt nichts, Python über dieses tun kann, ohne eine große Veränderung der Sprache Implementierung.*
Sehen PrintFails auf der Python-Wiki für details, workarounds und links zu weiteren Informationen. Es gibt auch ein paar hundert dups dieses problem auf SO (obwohl viele von Ihnen werden spezifisch für Python 2.x, ohne es zu erwähnen).
* Windows hat einen ganz eigenen Satz von APIs für den Druck von UTF-16 zu dem terminal, so dass Python erkennen könnte, dass stdout ist ein Windows-terminal, und wenn ja, encode in UTF-16 und verwenden Sie den speziellen APIs anstelle der Codierung, um die terminal-charset-und der standard diejenigen. Aber dies wirft eine Reihe von verschiedenen Problemen (zum Beispiel, verschiedene Arten von Druck zu
stdout
immer out of sync). Es wurde eine Diskussion über diese Veränderungen, aber auch wenn jeder einverstanden ist und den patch geschrieben wurden, morgen, es würde trotzdem nicht helfen, bis Sie sich ein upgrade auf jeden zukünftigen version von Python Hinzugefügt,...@N-Saba, was ist die Zeichenfolge, die den Fehler verursacht geworfen werden?
In meinem test-Fall, sieht für eine bestimmte version bug in python 2.7.3.
In der feed-ich war der Parsen, die "Titel" - Feld hatte den folgenden Wert:
Bekomme ich die erwartete richtige Apostroph char wenn ich Anrufe, entweder von diesen, in python 2.7.6.
In 2.7.3, bekomme ich die Fehlermeldung, es sei denn, ich kodiere den Wert, den ich durch gezogen KeyName.
fwiw, die @abamert Befehl print ("\u2019') gibt "9". Ich denke, dass das beabsichtigt war der code print(u'\u2019').
u
ist nicht erforderlich für Python 3, da es standardmäßig auf Unicode.Stieß ich auf einen ähnlichen Fehler beim schreiben einer API-JSON-Ausgabe in eine .cav-Datei über
pd.DataFrame.to_csv()
auf einem Win installieren von Python-2.7.14.Angabe der Kodierung als
utf-8
meine Feste-Prozess:Für alle, die Begegnung mit dieser in macOS, @abarnert s Antwort ist korrekt und ich war in der Lage, es zu beheben, indem Sie diesen an der Spitze der beschädigten Quelldatei:-
Zu klären, dies wird sicherstellen, dass die terminal-Ausgabe akzeptiert Unicode korrekt.
Ich IDLE (Python Shell) und Fenster CMD ein Standard-schriftart auf Lucida Console (utf-8 unterstützt, schriftart) und diese Art von Fehler ging Weg; und Sie sehen nicht mehr Boxen [][][][][][][][]
🙂