Qual è la differenza tra json.dump () e json.dumps () in Python?


131

Ho cercato in questo documento ufficiale per trovare la differenza tra json.dump () e json.dumps () in Python. È chiaro che sono correlati con l'opzione di scrittura del file.
Ma qual è la differenza dettagliata tra loro e in quali situazioni uno ha più vantaggi rispetto agli altri?

Risposte:


146

Non c'è molto altro da aggiungere se non quello che dicono i documenti. Se vuoi scaricare JSON in un file / socket o altro, allora dovresti andare con dump(). Se ti serve solo come stringa (per la stampa, l'analisi o altro), usa dumps()(stringa di dump)

Come menzionato da Antii Haapala in questa risposta , ci sono alcune piccole differenze nel ensure_asciicomportamento. Ciò è dovuto principalmente al modo in cui write()funziona la funzione sottostante , in quanto opera su blocchi piuttosto che sull'intera stringa. Controlla la sua risposta per maggiori dettagli al riguardo.

json.dump()

Serializza obj come stream formattato JSON su fp (a .write () - che supporta un oggetto simile a un file

Se sure_ascii è False, alcuni blocchi scritti in fp potrebbero essere istanze unicode

json.dumps()

Serializza obj su una str in formato JSON

Se sure_ascii è False, il risultato può contenere caratteri non ASCII e il valore restituito può essere un'istanza unicode


Puoi mostrare un esempio su come usare dump () per inviare tramite socket? So che posso usare dumps () e che encode () per convertire in byte, ma c'è un modo più breve?
Ragazzo

37

Le funzioni con i sparametri di una stringa take. Gli altri accettano flussi di file.


20

In uso della memoria e velocità.

Quando lo chiami jsonstr = json.dumps(mydata)prima crea una copia completa dei tuoi dati in memoria e solo allora tufile.write(jsonstr) su disco. Quindi questo è un metodo più veloce ma può essere un problema se hai un grosso pezzo di dati da salvare.

Quando chiami json.dump(mydata, file)- senza "s", la nuova memoria non viene utilizzata, poiché i dati vengono scaricati da blocchi. Ma l'intero processo è circa 2 volte più lento.

Fonte: ho controllato il codice sorgente di json.dump() ejson.dumps() anche testato entrambe le varianti misurando il tempo con time.time()e guardando l'utilizzo della memoria in htop.


6

Una notevole differenza in Python 2 è che se stai usando ensure_ascii=False,dump scriverà correttamente i dati codificati UTF-8 nel file (a meno che tu non abbia usato stringhe a 8 bit con caratteri estesi che non sono UTF-8):

dumpsd'altra parte, con ensure_ascii=Falsepuò produrre un stro unicodesemplicemente a seconda di quali tipi hai usato per le stringhe:

Serializza obj su una str formattata JSON usando questa tabella di conversione. Se sure_ascii è False, il risultato può contenere caratteri non ASCII e il valore restituito può essere unicodeun'istanza .

(enfasi mia). Si noti che potrebbe anche essere strun'istanza.

Pertanto, non è possibile utilizzare il valore restituito per salvare la struttura in un file senza controllare con quale formato è stato restituito ed eventualmente giocare unicode.encode.

Questo ovviamente non è più un problema valido in Python 3, poiché non c'è più questa confusione a 8 bit / Unicode.


Per quanto riguarda loadvs loads, loadconsidera l' intero file come un documento JSON, quindi non è possibile utilizzarlo per leggere più documenti JSON limitati di nuova riga da un singolo file.


Tutto il testo creato in un oggetto stringa python è unicode, ma è sicuro supporre che genericamente? cioè quando si caricano contenuti da un file?
João Gonçalves,

@ JoãoGonçalves significa che non puoi mescolare i dati binari con il testo in modo che Python li approvi silenziosamente. es. json.dumps([b'123'])-> TypeError.
Antti Haapala,

@ JoãoGonçalves nota anche che le stringhe nei documenti JSON devono essere Unicode e devono trovarsi in qualsiasi UTF-8, UTF-16 o UTF-32 secondo RFC 7159
Antti Haapala

1
Grazie per questa spiegazione! Ha senso
João Gonçalves,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.