Ich verwende Python 2 , um JSON aus ASCII-codierten Textdateien zu analysieren .
Beim Laden dieser Dateien mit entweder json
oder simplejson
werden alle meine Zeichenfolgenwerte in Unicode-Objekte anstelle von Zeichenfolgenobjekten umgewandelt. Das Problem ist, ich muss die Daten mit einigen Bibliotheken verwenden, die nur Zeichenfolgenobjekte akzeptieren. Ich kann die Bibliotheken weder ändern noch aktualisieren.
Ist es möglich, String-Objekte anstelle von Unicode-Objekten abzurufen?
Beispiel
>>> import json
>>> original_list = ['a', 'b']
>>> json_list = json.dumps(original_list)
>>> json_list
'["a", "b"]'
>>> new_list = json.loads(json_list)
>>> new_list
[u'a', u'b'] # I want these to be of type `str`, not `unicode`
Aktualisieren
Diese Frage wurde vor langer Zeit gestellt , als ich mit Python 2 feststeckte . Eine einfache und saubere Lösung für heute ist die Verwendung einer aktuellen Version von Python - dh Python 3 und höher.
python
json
serialization
unicode
python-2.x
Brutus
quelle
quelle
str
Antworten:
Eine Lösung mit
object_hook
Anwendungsbeispiel:
Wie funktioniert das und warum sollte ich es verwenden?
Mark Amerys Funktion ist kürzer und klarer als diese. Worum geht es also? Warum sollten Sie sie verwenden wollen?
Nur für die Leistung . Marks Antwort dekodiert den JSON-Text zuerst vollständig mit Unicode-Zeichenfolgen und rekursiert dann den gesamten dekodierten Wert, um alle Zeichenfolgen in Byte-Zeichenfolgen zu konvertieren. Dies hat einige unerwünschte Auswirkungen:
Diese Antwort verringert diese beiden Leistungsprobleme mithilfe des
object_hook
Parametersjson.load
undjson.loads
. Aus den Dokumenten :Da Wörterbücher, die viele Ebenen tief in anderen Wörterbüchern verschachtelt
object_hook
sind, beim Dekodieren übergeben werden , können wir an dieser Stelle alle darin enthaltenen Zeichenfolgen oder Listen byteifizieren und später die Notwendigkeit einer tiefen Rekursion vermeiden.Marks Antwort ist nicht für die Verwendung
object_hook
in der jetzigen Form geeignet , da sie in verschachtelte Wörterbücher zurückgeführt wird. Wir verhindern , dass die Rekursion in dieser Antwort mit demignore_dicts
Parameter auf_byteify
, die jederzeit an sie übergeben wird , außer wennobject_hook
übergibt sie ein neuesdict
byteify. Dasignore_dicts
Flag weist_byteify
an,dict
s zu ignorieren, da sie bereits byteifiziert wurden.Schließlich haben unsere Implementierungen von
json_load_byteified
undjson_loads_byteified
rufen_byteify
(mitignore_dicts=True
) das Ergebnis auf, das vonjson.load
oder zurückgegeben wurdejson.loads
, um den Fall zu behandeln, in dem der zu dekodierende JSON-Text keindict
oberstes Element hat.quelle
return { byteify(key, ignore_dicts=True): _byteify(value, ignore_dicts=True) for key, value in data.iteritems() }
durch,return dict((_byteify(key, ignore_dicts=True), _byteify(value, ignore_dicts=True)) for key, value in data.iteritems())
damit sie funktioniert.json_loads_byteified('[' * 990 + ']' * 990)
. Mit 991 stürzt es ab. Marks arbeitet immer noch mit 991 :byteify(json.loads('[' * 991 + ']' * 991))
. Es stürzt bei 992 ab. Zumindest in diesem Test kann Marks tiefer gehen, im Gegensatz zu dem, was Sie gesagt haben.Obwohl es hier einige gute Antworten gibt, habe ich PyYAML zum Parsen meiner JSON-Dateien verwendet, da die Schlüssel und Werte als Typzeichenfolgen
str
anstelle vonunicode
Typ angegeben werden. Da JSON eine Teilmenge von YAML ist, funktioniert es gut:Anmerkungen
Einige Dinge zu beachten:
Ich erhalte Zeichenfolgenobjekte, da alle meine Einträge ASCII-codiert sind . Wenn ich Unicode-codierte Einträge verwenden würde, würde ich sie als Unicode-Objekte zurückerhalten - es gibt keine Konvertierung!
Sie sollten (wahrscheinlich immer) die PyYAML-
safe_load
Funktion verwenden. Wenn Sie damit JSON-Dateien laden, benötigen Sieload
ohnehin nicht die "zusätzliche Leistung" der Funktion.Wenn Sie einen YAML-Parser möchten, der die 1.2-Version der Spezifikation besser unterstützt (und sehr niedrige Zahlen korrekt analysiert ), versuchen Sie es mit Ruamel YAML :
pip install ruamel.yaml
und dasimport ruamel.yaml as yaml
war alles, was ich für meine Tests brauchte.Umwandlung
Wie gesagt, es gibt keine Konvertierung! Wenn Sie nicht sicher sein können, nur mit ASCII-Werten umzugehen (und Sie können die meiste Zeit nicht sicher sein), verwenden Sie besser eine Konvertierungsfunktion :
Ich habe das von Mark Amery jetzt ein paar Mal benutzt, es funktioniert großartig und ist sehr einfach zu bedienen. Sie können
object_hook
stattdessen auch eine ähnliche Funktion verwenden, da dies zu einer Leistungssteigerung bei großen Dateien führen kann. Siehe dazu die etwas aufwendigere Antwort von Mirec Miskuf .quelle
yaml.load(json.dumps([u'a', u'£', u'É']))
die Python-Shell auszuführen, und stellen Sie fest, dass Sie zurückkehren['a', u'\xa3', u'\xc9']
(dieunicode
Zeichenfolgen enthält ). Wenn Sie nicht sicher sein können, dass Ihre Daten nur Zeichen aus dem ASCII-Zeichensatz enthalten, sollten Sie stattdessen einen anderen Ansatz verwenden (ich empfehle meine eigene Antwort).[u'a', u'b']
vorsichtig.Es gibt keine integrierte Option, mit der die Funktionen des JSON-Moduls Byte-Zeichenfolgen anstelle von Unicode-Zeichenfolgen zurückgeben. Diese kurze und einfache rekursive Funktion konvertiert jedoch jedes dekodierte JSON-Objekt von der Verwendung von Unicode-Zeichenfolgen in UTF-8-codierte Byte-Zeichenfolgen:
Rufen Sie dies einfach an der Ausgabe auf, die Sie von einem
json.load
oder einemjson.loads
Anruf erhalten.Ein paar Anmerkungen:
return {byteify(key): byteify(value) for key, value in input.iteritems()}
durchreturn dict([(byteify(key), byteify(value)) for key, value in input.iteritems()])
, da das Wörterbuchverständnis erst mit Python 2.7 unterstützt wurde.object_hook
oder vermiedenobject_pairs_hook
werden können. Mirec Miskufs Antwort ist bislang die einzige, die es schafft, dies richtig durchzuziehen, obwohl sie infolgedessen wesentlich komplizierter ist als mein Ansatz.quelle
object_hook
ist zwar weitaus schlechter als diese, aber mitobject_pairs_hook
können Sie eine einigermaßen effiziente Methode finden , die keine Rekursion oder erneute Überprüfung von Knoten erfordert, die keine Zeichenfolgen enthalten.object_pairs_hook
Methode ist vielleicht etwas schwieriger zu verstehen als diese (Sie müssen verstehen, wie der Parameter funktioniert und warum Listen und Diktate eine andere Behandlung erfordern), und der Leistungsvorteil wird für die meisten Menschen keine Rolle spielen ... aber ich würde erwarten Es muss existieren, insbesondere für alle, die sich mit einem ungewöhnlich tief verschachtelten JSON-Objekt befassen.Mit dem
object_hook
Parameter für können Siejson.loads
einen Konverter übergeben. Sie müssen die Konvertierung nicht nachträglich durchführen. Dasjson
Modul übergibt immerobject_hook
nur die Diktate und rekursiv verschachtelte Diktate, sodass Sie nicht selbst in verschachtelte Diktate zurückgreifen müssen. Ich glaube nicht, dass ich Unicode-Strings in Zahlen wie Wells-Shows konvertieren würde. Wenn es sich um eine Unicode-Zeichenfolge handelt, wurde sie in der JSON-Datei als Zeichenfolge angegeben, daher sollte es sich um eine Zeichenfolge handeln (oder die Datei ist fehlerhaft).Außerdem würde ich versuchen, so etwas wie
str(val)
einunicode
Objekt zu vermeiden . Sie solltenvalue.encode(encoding)
eine gültige Codierung verwenden, je nachdem, was Ihre externe Bibliothek erwartet.Also zum Beispiel:
quelle
s
ein JSON istObject
(eine ungeordnete Sammlung von Schlüssel: Wert-Paaren mit dem Zeichen ':', das den Schlüssel und den Wert trennt, durch Kommas getrennt und in geschweiften Klammern eingeschlossen), aber nicht, wenn es sich beispielsweise um a handelt JSONArray
. Wenn Sie also einen JSON-Array
ähnlichen Wert erhalten["a", "b"]
, bleibt das Ergebnis erhalten[u'a', u'b']
. Keiner der anderen derzeit verfügbaren Customizing-Hook-Parameter fürjson.loads()
kann diese Aufgabe ausführen.json
Modul , wie Sie bereits erwähnt haben, verschachteltedict
s rekursiv übergibt , ist es nicht erforderlich, in den beiden Funktionenelif
nach ihnen zu suchen. Daher sollten die beiden Klauseln, die nach ihnen suchen, entfernt werden.from Utility import *
, werden die Funktionen aufgrund dieses Unterstrichs nicht angezeigt .object_hook
wird für jedes analysierte JSON-Objekt aufgerufen. Wenn Sie also auf das zurückgreifen, was Ihnen gegeben wurde, "byteifizieren" Sie Dinge, die Sie bereits "byteifiziert" haben. Die Leistung wird geometrisch mit der Größe des Objekts zunehmen. Ich habe hier eine Antwort eingefügt , dieobject_pairs_hook
dieses Problem verwendet und nicht darunter leidet.Das liegt daran, dass json keinen Unterschied zwischen String-Objekten und Unicode-Objekten hat. Sie sind alle Zeichenfolgen in Javascript.
Ich denke, JSON ist richtig, um Unicode-Objekte zurückzugeben . Tatsächlich würde ich nichts weniger akzeptieren, da Javascript-Zeichenfolgen tatsächlich
unicode
Objekte sind (dh JSON-Zeichenfolgen (Javascript) können jede Art von Unicode-Zeichen speichern). Daher ist es sinnvoll,unicode
Objekte zu erstellen , wenn Zeichenfolgen aus JSON übersetzt werden. Einfache Zeichenfolgen würden einfach nicht passen, da die Bibliothek die gewünschte Codierung erraten müsste.Es ist besser,
unicode
überall String-Objekte zu verwenden . Am besten aktualisieren Sie Ihre Bibliotheken, damit sie mit Unicode-Objekten umgehen können.Wenn Sie jedoch wirklich Bytestrings möchten, codieren Sie die Ergebnisse einfach in die Codierung Ihrer Wahl:
quelle
Es gibt eine einfache Umgehung.
TL; DR - Verwenden Sie
ast.literal_eval()
anstelle vonjson.loads()
. Beideast
undjson
sind in der Standardbibliothek.Obwohl dies keine „perfekte“ Antwort ist, ist es ziemlich weit, wenn Sie Unicode ganz ignorieren möchten. In Python 2.7
gibt:
Dies wird haariger, wenn einige Objekte wirklich Unicode-Zeichenfolgen sind. Die vollständige Antwort wird schnell haarig.
quelle
null
,true
oderfalse
Werte, weil sie nicht gültig in Python sind und dazu führen ,literal_eval()
zum Scheitern verurteilt.\/
) in einer Zeichenfolge oder eine Unicode-Escape-Sequenz (wie"\u0061"
eine andere Schreibweise"a"
) enthält. Die wörtliche Syntax von Python ist in mehrfacher Hinsicht nicht mit JSON kompatibel, und ich würde dieser Antwort für kein Skript vertrauen, das ich nicht wegwerfen würde.json
zum Speichern der Daten verwenden, sondern nur,print
wenn Python ausgeführt wird. Dannast.literal_eval
funktioniertDie Antwort von Mike Brennan ist knapp, aber es gibt keinen Grund, die gesamte Struktur erneut zu durchqueren. Wenn Sie den
object_hook_pairs
Parameter (Python 2.7+) verwenden:Damit erhalten Sie jedes JSON-Objekt, sodass Sie die Dekodierung ohne Rekursion durchführen können:
Beachten Sie, dass ich den Hook nie rekursiv aufrufen muss, da jedes Objekt an den Hook übergeben wird, wenn Sie den verwenden
object_pairs_hook
. Sie müssen sich um Listen kümmern, aber wie Sie sehen können, wird ein Objekt in einer Liste ordnungsgemäß konvertiert, und Sie müssen nicht rekursiv arbeiten, um dies zu erreichen.EDIT: Ein Mitarbeiter wies darauf hin, dass Python2.6 nicht hat
object_hook_pairs
. Sie können diesen Python2.6 weiterhin verwenden, indem Sie eine sehr kleine Änderung vornehmen. Ändern Sie im Haken oben:zu
Dann verwenden Sie
object_hook
anstelle vonobject_pairs_hook
:Wenn Sie
object_pairs_hook
Ergebnisse verwenden, wird für jedes Objekt im JSON-Objekt ein Wörterbuch weniger instanziiert. Wenn Sie ein großes Dokument analysieren, lohnt sich dies möglicherweise.quelle
deunicodify_hook
, die Sie in dieser Antwort ausstellen? Im Moment haben Sie eine Implementierungdeunicodify_hook
, die nicht über Listen iteriert und die darin enthaltenen Zeichenfolgen und Listen entkodifiziert. Daher stimmt die Ausgabe, die Sie anzeigen, nicht mit der Ausgabe überein, die Ihr Hook tatsächlich erzeugt. Beheben Sie das, und diese Antwort ist meiner überlegen.object_pairs_hook
nur für Objekte aufgerufen wird , schlägt diese Lösung fehl, wenn Ihr JSON-Text eine Liste von Zeichenfolgen auf der obersten Ebene enthält. Es gibt keine Möglichkeit, dies zu beheben, ohne eine Funktion für das zurückgegebene Objekt aufzurufenjson.load
. Keiner derjson.load
Haken kann garantieren, dass Sie mit jeder Saite umgehen können. Ich denke, dies ist ein Fehler, der groß genug ist, um meine Lösung weiterhin über die Verwendung der Haken zu empfehlen.Ich fürchte, es gibt keine Möglichkeit, dies automatisch in der simplejson-Bibliothek zu erreichen.
Der Scanner und Decoder in simplejson sind für die Erzeugung von Unicode-Text ausgelegt. Zu diesem Zweck verwendet die Bibliothek eine Funktion namens
c_scanstring
(falls verfügbar, aus Gründen der Geschwindigkeit) oderpy_scanstring
wenn die C-Version nicht verfügbar ist. Diescanstring
Funktion wird von fast jeder Routine, die simplejson zum Dekodieren einer Struktur hat, die möglicherweise Text enthält, mehrmals aufgerufen. Siescanstring
müssten entweder den Wert in simplejson.decoder oder eine Unterklasse monkeypatchenJSONDecoder
und so ziemlich Ihre gesamte Implementierung von allem bereitstellen, was Text enthalten könnte.Der Grund, warum simplejson Unicode ausgibt, ist, dass in der json-Spezifikation ausdrücklich erwähnt wird, dass "Eine Zeichenfolge eine Sammlung von null oder mehr Unicode-Zeichen ist" ... Unterstützung für Unicode wird als Teil des Formats selbst angenommen. Die
scanstring
Implementierung von Simplejson geht so weit, Unicode- Escapezeichen zu scannen und zu interpretieren (sogar die Fehlerprüfung auf fehlerhafte Mehrbyte-Zeichensatzdarstellungen). Der einzige Weg, den Wert zuverlässig an Sie zurückzugeben, ist Unicode.Wenn Sie eine veraltete Bibliothek haben, die eine benötigt
str
, empfehle ich Ihnen, entweder die verschachtelte Datenstruktur nach dem Parsen mühsam zu durchsuchen (was ich ausdrücklich als das bezeichne, was Sie ausdrücklich vermeiden wollten ... Entschuldigung) oder Ihre Bibliotheken in eine Art zu verpacken Fassade, wo Sie die Eingabeparameter auf einer detaillierteren Ebene massieren können. Der zweite Ansatz ist möglicherweise einfacher zu handhaben als der erste, wenn Ihre Datenstrukturen tatsächlich tief verschachtelt sind.quelle
Wie Mark (Amery) richtig bemerkt: Die Verwendung von PyYamls Deserializer auf einem JSON-Dump funktioniert nur, wenn Sie nur über ASCII verfügen. Zumindest sofort.
Zwei kurze Kommentare zum PyYaml-Ansatz:
NIEMALS yaml.load auf Daten aus dem Feld. Es ist eine Funktion (!) Von yaml, um beliebigen Code auszuführen, der in der Struktur versteckt ist.
Sie können es auch für Nicht-ASCII-Dateien so einrichten:
Aber die Leistung ist nicht mit Mark Amerys Antwort zu vergleichen:
Wenn ich einige tief verschachtelte Beispieldiktate auf die beiden Methoden wirf, erhalte ich Folgendes (mit dt [j] = Zeitdelta von json.loads (json.dumps (m))):
Deserialisierung, einschließlich vollständiges Durchlaufen des Baums und Codierung, in der Größenordnung der C-basierten Implementierung von json. Ich finde das bemerkenswert schnell und es ist auch robuster als die Yaml-Ladung bei tief verschachtelten Strukturen. Und weniger anfällig für Sicherheitsfehler, wenn man sich yaml.load ansieht.
=> Während ich einen Zeiger auf einen C-basierten Konverter begrüßen würde, sollte die Byteify-Funktion die Standardantwort sein.
Dies gilt insbesondere dann, wenn Ihre JSON-Struktur aus dem Feld stammt und Benutzereingaben enthält. Denn dann müssen Sie wahrscheinlich trotzdem über Ihre Struktur gehen - unabhängig von Ihren gewünschten internen Datenstrukturen (nur 'Unicode-Sandwich' oder Byte-Strings).
Warum?
Unicode- Normalisierung . Für Unbewusste: Nehmen Sie ein Schmerzmittel und lesen Sie dies .
Mit der Byteify-Rekursion töten Sie also zwei Fliegen mit einer Klappe:
In meinen Tests stellte sich heraus, dass das Ersetzen des input.encode ('utf-8') durch einen unicodedata.normalize ('NFC', Eingabe) .encode ('utf-8') noch schneller war als ohne NFC - aber Das hängt stark von den Beispieldaten ab, denke ich.
quelle
Die gotcha ist , dass
simplejson
undjson
sind zwei verschiedene Module, zumindest in der Form , die sie mit Unicode umgehen. Sie habenjson
in py 2.6+ und dies gibt Ihnen Unicode-Werte, währendsimplejson
String-Objekte zurückgegeben werden. Versuchen Sie einfach easy_installing simplejson in Ihrer Umgebung und prüfen Sie, ob dies funktioniert. Es hat für mich getan.quelle
Verwenden Sie einfach Pickle anstelle von JSON für Dump und Load, wie folgt:
Die Ausgabe ist (Zeichenfolgen und Ganzzahlen werden korrekt behandelt):
quelle
safe_load
in YAML, ich weiß nicht, ob es etwas Ähnliches für Gurke gibt .Also bin ich auf das gleiche Problem gestoßen. Ratet mal, was das erste Google-Ergebnis war.
Da ich alle Daten an PyGTK übergeben muss, sind Unicode-Zeichenfolgen für mich auch nicht sehr nützlich. Ich habe also eine andere rekursive Konvertierungsmethode. Es wird tatsächlich auch für die typsichere JSON-Konvertierung benötigt - json.dump () würde auf Nicht-Literale wie Python-Objekte zugreifen. Konvertiert jedoch keine Diktatindizes.
quelle
Ich hatte ein JSON-Diktat als Zeichenfolge. Die Schlüssel und Werte waren Unicode-Objekte wie im folgenden Beispiel:
Ich könnte die
byteify
oben vorgeschlagene Funktion verwenden, indem ich die Zeichenfolge mit in eindict
Objekt konvertiereast.literal_eval(myStringDict)
.quelle
{u'key':u'value'}
ist nicht JSON.Unterstützt Python2 & 3 mit Hook (von https://stackoverflow.com/a/33571117/558397 )
Kehrt zurück:
quelle
Das ist spät im Spiel, aber ich habe diesen rekursiven Zaubernden gebaut. Es funktioniert für meine Bedürfnisse und ich denke, es ist relativ vollständig. Es kann Ihnen helfen.
Übergeben Sie einfach ein JSON-Objekt wie folgt:
Ich habe es als privates Mitglied einer Klasse, aber Sie können die Methode nach Belieben neu verwenden.
quelle
json.loads
Aufruf ist zuerst erforderlich), versucht willkürlich, Zeichenfolgen ohne erklärten Grund in Ints umzuwandeln, und ist kein Kopieren und- Paste fertig.Ich habe Wells '_parse_json () neu geschrieben, um Fälle zu behandeln, in denen das json-Objekt selbst ein Array ist (mein Anwendungsfall).
quelle
Hier ist ein rekursiver Encoder in C: https://github.com/axiros/nested_encode
Leistungsaufwand für "durchschnittliche" Strukturen um 10% im Vergleich zu json.loads.
mit dieser Teststruktur:
quelle
Mit Python 3.6 stoße ich manchmal immer noch auf dieses Problem. Wenn ich beispielsweise eine Antwort von einer REST-API erhalte und den Antworttext in JSON lade, erhalte ich immer noch die Unicode-Zeichenfolgen. Mit json.dumps () eine einfache Lösung gefunden.
quelle
Ich bin auch auf dieses Problem gestoßen, und da ich mich mit JSON befassen musste, kam ich auf eine kleine Schleife, die die Unicode-Schlüssel in Zeichenfolgen konvertiert. (Bei
simplejson
GAE werden keine Zeichenfolgenschlüssel zurückgegeben.)obj
ist das aus JSON dekodierte Objekt:kwargs
ist das, was ich an den Konstruktor der GAE-Anwendung übergebe (die keineunicode
Schlüssel mag**kwargs
)Nicht so robust wie die Lösung von Wells, aber viel kleiner.
quelle
Ich habe den Code aus der Antwort von Mark Amery angepasst , insbesondere um ihn
isinstance
für die Profis des Ententypens loszuwerden .Die Codierung erfolgt manuell und
ensure_ascii
ist deaktiviert. Die Python-Dokumente fürjson.dump
sagen dasHaftungsausschluss: Im Doctest habe ich die ungarische Sprache verwendet. Einige bemerkenswerte ungarische Zeichenkodierungen sind:
cp852
die verwendete IBM / OEM-Kodierung, z. in DOS (manchmal als ASCII bezeichnet , fälschlicherweise denke ich, es hängt von der Codepage- Einstellung ab),cp1250
z. in Windows (manchmal als ansi bezeichnet , abhängig von den Ländereinstellungen ) undiso-8859-2
manchmal auf http-Servern verwendet. Der TesttextTüskéshátú kígyóbűvölő
wird Koltai László (einheimische Form des persönlichen Namens) zugeschrieben und stammt aus Wikipedia .Ich möchte auch die Antwort von Jarret Hardie hervorheben, die auf die JSON-Spezifikation verweist und Folgendes zitiert:
In meinem Anwendungsfall hatte ich Dateien mit json. Sie sind
utf-8
verschlüsselte Dateien.ensure_ascii
führt zu ordnungsgemäß maskierten, aber nicht gut lesbaren JSON-Dateien. Deshalb habe ich Mark Amerys Antwort an meine Bedürfnisse angepasst.Das Doctest ist nicht besonders nachdenklich, aber ich teile den Code in der Hoffnung, dass er für jemanden nützlich sein wird.
quelle
json.loads
um Listen oder Diktate handelt, nicht um benutzerdefinierte oder bibliotheksdefinierte Typen, die ihre Methoden und magischen Methoden implementieren. Warum also nicht einfach eineisinstance
Überprüfung durchführen? Ist das nicht einfacher zu verstehen, als zu prüfen,iteritems
obiter
das Objekt vorhanden ist oder ob es als Argument akzeptiert wird?Schauen Sie sich diese Antwort auf eine ähnliche Frage an, die dies besagt
Das U-Präfix bedeutet nur, dass Sie eine Unicode-Zeichenfolge haben. Wenn Sie die Zeichenfolge wirklich verwenden, wird sie in Ihren Daten nicht angezeigt. Lassen Sie sich nicht von der gedruckten Ausgabe werfen.
Versuchen Sie zum Beispiel Folgendes:
Du wirst kein u sehen.
quelle
'{}'.format({u'x' : u'y'})
schließt noch die u's ein.