web-dev-qa-db-fra.com

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

J'ai cherché dans this 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 on a plus d’avantage que d’autres?

87
Kumaran

Il n’ya pratiquement rien d’autre à ajouter que ce que disent les docs. Si vous voulez vider le JSON dans un fichier/socket ou autre, vous devriez alors choisir dump(). Si vous n'en avez besoin que sous forme de chaîne (pour l'impression, l'analyse ou autre), utilisez dumps() (chaîne de vidage).

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

json.dump()

Sérialiser obj sous forme de flux au format JSON dans fp (un .write () - objet de type fichier prenant en charge

Si Ensure_ascii a la valeur False, certains morceaux écrits dans fp peuvent être des instances unicode.

json.dumps()

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

Si Ensure_ascii a la valeur False, le résultat peut contenir des caractères non-ASCII et la valeur renvoyée peut être une instance unicode.

95
João Gonçalves

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

25
Pratik Gujarathi

Une différence notable entre Python 2 est que si vous utilisez ensure_ascii=False, dump écrit correctement les données codé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):

dumps d'autre part, avec ensure_ascii=False peut produire un str ou unicode uniquement en fonction des types que vous avez utilisés pour les chaînes:

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

(c'est moi qui souligne). Notez qu'il peut toujours s'agir d'une instance str.

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

Bien entendu, cela n’est plus une préoccupation dans Python 3, car il n’ya plus cette confusion 8 bits/Unicode.


Comme pour load vs loads, load considère le fichier entier comme un document JSON, vous ne pouvez donc pas l'utiliser pour lire plusieurs documents JSON limités à une nouvelle ligne à partir d'un fichier. un seul fichier.

5
Antti Haapala

En mémoire utilisation et vitesse.

Lorsque vous appelez jsonstr = json.dumps(mydata), il crée d'abord une copie complète de vos données en mémoire, puis vous file.write(jsonstr) sur disque. Il s’agit donc d’une méthode plus rapide mais qui peut poser problème si vous devez sauvegarder de gros volumes de données.

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 morceaux. Mais tout le processus est environ deux fois plus lent.

Source: J'ai vérifié le code source de json.dump() et json.dumps(), ainsi que les variantes mesurant l'heure avec time.time() et surveillant l'utilisation de la mémoire dans htop.

1
JenyaKh