Quelle est la différence entre json.dump () et json.dumps () en python?

131

J'ai cherché dans ce document officiel pour trouver la différence entre json.dump () et json.dumps () en python. Il est clair qu'ils sont liés à l'option d'écriture de fichier.
Mais quelle est la différence détaillée entre eux et dans quelles situations l'un a plus d'avantages que l'autre?

Kumaran
la source

Réponses:

146

Il n'y a pas grand chose d'autre à ajouter que ce que disent les documents. Si vous voulez vider le JSON dans un fichier / socket ou autre, alors vous devriez aller avec dump(). Si vous n'en avez besoin que sous forme de chaîne (pour l'impression, l'analyse ou autre), utilisez dumps()(dump string)

Comme mentionné par Antii Haapala dans cette réponse , il existe quelques différences mineures sur le ensure_asciicomportement. Ceci est principalement dû au fonctionnement de la write()fonction sous-jacente , étant qu'elle opère sur des morceaux plutôt que sur la chaîne entière. Vérifiez sa réponse pour plus de détails à ce sujet.

json.dump()

Sérialiser obj en tant que flux au format JSON en fp (un .write () - objet de type fichier

Si ensure_ascii vaut False, certains morceaux écrits dans fp peuvent être des instances Unicode

json.dumps()

Sérialiser obj en une chaîne au format JSON

Si ensure_ascii vaut False, le résultat peut contenir des caractères non ASCII et la valeur de retour peut être une instance Unicode

João Gonçalves
la source
Pouvez-vous montrer un exemple sur la façon d'utiliser dump () pour envoyer via socket? Je sais que je peux utiliser dumps () et que encode () pour convertir en octets, mais y a-t-il un moyen plus court?
Garçon
37

Les fonctions avec sdes paramètres de chaîne de prise. Les autres prennent des flux de fichiers.

Pratik Gujarathi
la source
20

Dans l'utilisation de la mémoire et la vitesse.

Lorsque vous l'appelez, jsonstr = json.dumps(mydata)il crée d'abord une copie complète de vos données en mémoire et ensuite seulement vous les placez file.write(jsonstr)sur le disque. C'est donc une méthode plus rapide mais qui peut poser problème si vous avez un gros morceau de données à sauvegarder.

Lorsque vous appelez json.dump(mydata, file)- sans «s», la nouvelle mémoire n'est pas utilisée, car les données sont vidées par blocs. Mais l'ensemble du processus est environ 2 fois plus lent.

Source: J'ai vérifié le code source json.dump()et json.dumps()ainsi testé les deux variantes de mesure du temps avec time.time()et regarder l'utilisation de la mémoire dans htop.

JenyaKh
la source
6

Une différence notable dans Python 2 est que si vous utilisez ensure_ascii=False, dumpécrira correctement les données encodées en UTF-8 dans le fichier (sauf si vous avez utilisé des chaînes de 8 bits avec des caractères étendus qui ne sont pas UTF-8):

dumpsd'autre part, avec ensure_ascii=Falsepeut produire un strou unicodesimplement en fonction des types que vous avez utilisés pour les chaînes:

Sérialisez obj en une chaîne au format JSON à l'aide de cette table de conversion. Si ensure_ascii vaut False, le résultat peut contenir des caractères non ASCII et la valeur de retour peut être une unicodeinstance .

(c'est moi qui souligne). Notez qu'il peut également s'agir d'une strinstance.

Ainsi, vous ne pouvez pas utiliser sa valeur de retour pour enregistrer la structure dans un fichier sans vérifier quel format a été retourné et éventuellement jouer avec unicode.encode.

Ce n'est bien sûr plus une préoccupation valable dans Python 3, car il n'y a plus cette confusion 8 bits / Unicode.


Quant à loadvs loads, loadconsidère que le fichier entier est un document JSON, vous ne pouvez donc pas l'utiliser pour lire plusieurs documents JSON limités à la nouvelle ligne à partir d'un seul fichier.

Antti Haapala
la source
Tout le texte créé dans un objet chaîne python est unicode, mais est-il sûr de le supposer de manière générique? c'est-à-dire lors du chargement du contenu d'un fichier?
João Gonçalves
@ JoãoGonçalves cela signifie que vous ne pouvez pas mélanger des données binaires avec du texte pour que Python l'approuve silencieusement. par exemple json.dumps([b'123'])-> TypeError.
Antti Haapala
@ JoãoGonçalves notent également que les chaînes dans les documents JSON doivent être Unicode et doivent être en UTF-8, UTF-16 ou UTF-32 selon RFC 7159
Antti Haapala
1
Merci pour cette explication! Fait sens
João Gonçalves