Was ist der Unterschied zwischen json.dump () und json.dumps () in Python?
131
Ich habe in diesem offiziellen Dokument nach einem Unterschied zwischen json.dump () und json.dumps () in Python gesucht. Es ist klar, dass sie mit der Option zum Schreiben von Dateien zusammenhängen. Aber was ist der detaillierte Unterschied zwischen ihnen und in welchen Situationen hat man mehr Vorteile als andere?
Es gibt nicht viel anderes hinzuzufügen, als was die Dokumente sagen. Wenn Sie den JSON in eine Datei / einen Socket oder was auch immer kopieren möchten, sollten Sie mit gehen dump(). Wenn Sie es nur als Zeichenfolge benötigen (zum Drucken, Parsen oder was auch immer), verwenden Sie dumps()(Speicherauszugszeichenfolge).
Wie von Antii Haapala in dieser Antwort erwähnt , gibt es einige geringfügige Unterschiede im ensure_asciiVerhalten. Dies liegt hauptsächlich an der write()Funktionsweise der zugrunde liegenden Funktion, da sie eher mit Blöcken als mit der gesamten Zeichenfolge arbeitet. Überprüfen Sie seine Antwort für weitere Details dazu.
json.dump()
Serialisieren Sie obj als JSON-formatierten Stream in fp (ein .write () - unterstützendes dateiähnliches Objekt
Wenn sure_ascii False ist, können einige in fp geschriebene Chunks Unicode-Instanzen sein
json.dumps()
Serialisieren Sie obj in eine JSON-formatierte str
Wenn sure_ascii False ist, kann das Ergebnis Nicht-ASCII-Zeichen enthalten und der Rückgabewert kann eine Unicode-Instanz sein
Können Sie ein Beispiel für die Verwendung von dump () zum Senden über Sockets zeigen? Ich weiß, dass ich dumps () und dann encode () verwenden kann, um in Bytes zu konvertieren, aber gibt es einen kürzeren Weg?
Junge
37
Die Funktionen mit einem sTake-String-Parameter. Die anderen nehmen Dateistreams auf.
Wenn Sie es aufrufen jsonstr = json.dumps(mydata), wird zuerst eine vollständige Kopie Ihrer Daten im Speicher erstellt und erst dann Siefile.write(jsonstr) auf die Festplatte. Dies ist also eine schnellere Methode, kann jedoch ein Problem sein, wenn Sie große Datenmengen speichern müssen.
Wenn Sie anrufen json.dump(mydata, file)- ohne 's', wird kein neuer Speicher verwendet, da die Daten von Chunks ausgegeben werden. Der gesamte Vorgang ist jedoch etwa zweimal langsamer.
Quelle: Ich habe den Quellcode von json.dump()und überprüft json.dumps()und auch beide Varianten getestet, mit denen die Zeit gemessen time.time()und die Speichernutzung in htop beobachtet wurde.
Ein bemerkenswerter Unterschied in Python 2 ist, dass, wenn Sie verwenden ensure_ascii=False,dump werden richtig Schreib UTF-8 kodierten Daten in die Datei (es sei denn , Sie verwendeten 8-Bit - Strings mit erweiterten Zeichen , die nicht UTF-8) sind:
dumpsAuf der anderen Seite ensure_ascii=Falsekann mit a stroder unicodenur abhängig davon erzeugt werden, welche Typen Sie für Strings verwendet haben:
Serialisieren Sie obj mithilfe dieser Konvertierungstabelle in einen JSON-formatierten str. Wenn sure_ascii False ist, kann das Ergebnis Nicht-ASCII-Zeichen enthalten und der Rückgabewert kann eine unicodeInstanz sein .
(Hervorhebung von mir). Beachten Sie, dass es sich möglicherweise auch noch um eine strInstanz handelt.
Daher können Sie den Rückgabewert nicht zum Speichern der Struktur in einer Datei verwenden, ohne zu überprüfen, welches Format zurückgegeben wurde und möglicherweise damit gespielt wird unicode.encode.
Dies ist in Python 3 natürlich kein berechtigtes Problem mehr, da diese 8-Bit / Unicode-Verwirrung nicht mehr besteht.
Bei loadvs loadswird loaddie gesamte Datei als ein JSON-Dokument betrachtet, sodass Sie nicht mehrere JSON-Dokumente mit Zeilenumbruch aus einer einzigen Datei lesen können.
Der gesamte in einem Python-String-Objekt erstellte Text ist Unicode. Ist es jedoch sicher, dies generisch anzunehmen? dh beim Laden von Inhalten aus einer Datei?
João Gonçalves
@ JoãoGonçalves bedeutet, dass Sie keine Binärdaten mit Text mischen können, sodass Python diese stillschweigend genehmigt. zB json.dumps([b'123'])-> TypeError.
Antti Haapala
@ JoãoGonçalves auch zur Kenntnis tun , dass die Strings in JSON Dokumente Unicode sein muss , und muss in einem der UTF-8, UTF-16 oder UTF-32 nach RFC 7159
Die Funktionen mit einem
s
Take-String-Parameter. Die anderen nehmen Dateistreams auf.quelle
In Speichernutzung und Geschwindigkeit.
Wenn Sie es aufrufen
jsonstr = json.dumps(mydata)
, wird zuerst eine vollständige Kopie Ihrer Daten im Speicher erstellt und erst dann Siefile.write(jsonstr)
auf die Festplatte. Dies ist also eine schnellere Methode, kann jedoch ein Problem sein, wenn Sie große Datenmengen speichern müssen.Wenn Sie anrufen
json.dump(mydata, file)
- ohne 's', wird kein neuer Speicher verwendet, da die Daten von Chunks ausgegeben werden. Der gesamte Vorgang ist jedoch etwa zweimal langsamer.Quelle: Ich habe den Quellcode von
json.dump()
und überprüftjson.dumps()
und auch beide Varianten getestet, mit denen die Zeit gemessentime.time()
und die Speichernutzung in htop beobachtet wurde.quelle
Ein bemerkenswerter Unterschied in Python 2 ist, dass, wenn Sie verwenden
ensure_ascii=False
,dump
werden richtig Schreib UTF-8 kodierten Daten in die Datei (es sei denn , Sie verwendeten 8-Bit - Strings mit erweiterten Zeichen , die nicht UTF-8) sind:dumps
Auf der anderen Seiteensure_ascii=False
kann mit astr
oderunicode
nur abhängig davon erzeugt werden, welche Typen Sie für Strings verwendet haben:(Hervorhebung von mir). Beachten Sie, dass es sich möglicherweise auch noch um eine
str
Instanz handelt.Daher können Sie den Rückgabewert nicht zum Speichern der Struktur in einer Datei verwenden, ohne zu überprüfen, welches Format zurückgegeben wurde und möglicherweise damit gespielt wird
unicode.encode
.Dies ist in Python 3 natürlich kein berechtigtes Problem mehr, da diese 8-Bit / Unicode-Verwirrung nicht mehr besteht.
Bei
load
vsloads
wirdload
die gesamte Datei als ein JSON-Dokument betrachtet, sodass Sie nicht mehrere JSON-Dokumente mit Zeilenumbruch aus einer einzigen Datei lesen können.quelle
json.dumps([b'123'])
->TypeError
.