864 Stimmen

Speichern von UTF-8-Texten mit json.dumps als UTF-8, nicht als \u Escape-Sequenz

Beispielcode (in einem REPL):

import json
json_string = json.dumps(" ")
print(json_string)

Ausgabe:

"\u05d1\u05e8\u05d9 \u05e6\u05e7\u05dc\u05d4"

Das Problem: Es ist nicht menschenlesbar. Meine (intelligenten) Benutzer möchten möglicherweise Textdateien mit JSON-Dumps überprüfen oder sogar bearbeiten (und ich würde lieber kein XML verwenden).

Gibt es eine Möglichkeit, Objekte in UTF-8 JSON-Strings zu serialisieren (anstatt \uXXXX)?

5voto

Yulin GUO Punkte 161

Verwenden Sie Codecs, wenn möglich,

mit codecs.open('Dateipfad', 'a+', 'utf-8') as fp:
    fp.write(json.dumps(res, ensure_ascii=False))

-3voto

Ryan X Punkte 575

Die Verwendung von ensure_ascii=False in json.dumps ist der richtige Ansatz, um dieses Problem zu lösen, wie von Martijn hervorgehoben wurde. Allerdings kann dies eine Ausnahme auslösen:

UnicodeDecodeError: 'ascii' codec kann das Byte 0xe7 an Position 1 nicht entschlüsseln: Ordinalzahl nicht im Bereich (128)

Sie benötigen zusätzliche Einstellungen in entweder site.py oder sitecustomize.py, um Ihr sys.getdefaultencoding() korrekt einzustellen. site.py befindet sich unter lib/python2.7/ und sitecustomize.py unter lib/python2.7/site-packages.

Wenn Sie site.py nutzen möchten, ändern Sie unter def setencoding(): das erste if 0: zu if 1:, damit Python die Sprachumgebung Ihres Betriebssystems verwendet.

Wenn Sie lieber sitecustomize.py verwenden möchten, was möglicherweise nicht existiert, wenn Sie es nicht erstellt haben, fügen Sie einfach diese Zeilen hinzu:

import sys
reload(sys)
sys.setdefaultencoding('utf-8')

Dann können Sie chinesische JSON-Ausgaben im UTF-8-Format erstellen, wie zum Beispiel:

name = {"last_name": u""}
json.dumps(name, ensure_ascii=False)

Sie erhalten eine UTF-8-codierte Zeichenfolge, anstelle einer \u-escapten JSON-Zeichenfolge.

Um Ihre Standardcodierung zu überprüfen:

print sys.getdefaultencoding()

Sie sollten "utf-8" oder "UTF-8" erhalten, um Ihre Einstellungen in site.py oder sitecustomize.py zu überprüfen.

Bitte beachten Sie, dass Sie sys.setdefaultencoding("utf-8") nicht in einer interaktiven Python-Konsole ausführen können.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X