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?

Kumaran
quelle

Antworten:

146

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

João Gonçalves
quelle
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.

Pratik Gujarathi
quelle
20

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üft json.dumps()und auch beide Varianten getestet, mit denen die Zeit gemessen time.time()und die Speichernutzung in htop beobachtet wurde.

JenyaKh
quelle
6

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.

Antti Haapala
quelle
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
Antti Haapala
1
Danke für diese Erklärung! Sinnvoll
João Gonçalves