24 votes

Y a-t-il un moyen d'utiliser `json.dump` avec `gzip` ?

Ici est une excellente réponse sur la façon d'utiliser json.dumps pour écrire dans un fichier gzip. Ce que je voudrais faire, c'est utiliser la fonction dump pour sérialiser le fichier json directement dans un fichier de type GzipFile objet.

Exemple de code :

import gzip, json

data = # a dictionary of data here
with gzip.open(write_file, 'w') as zipfile:
   json.dump(data, zipfile)

L'erreur soulevée est la suivante

TypeError: memoryview: a bytes-like objet is required, not 'str'

Je pense que cela est dû au fait que la méthode gzip write() veut qu'un objet bytes lui soit passé. D'après la norme documentation ,

Le module json produit toujours des objets str, et non des objets bytes. Par conséquent, fp.write() doit supporter l'entrée str.

Existe-t-il un moyen d'envelopper le json la sortie de la chaîne de caractères sous forme d'octets, de sorte que GzipFile 's write() s'en chargera ? Ou est-ce que la seule façon de faire est d'utiliser json.dumps et encode() la chaîne résultante dans un objet octet, comme dans l'autre réponse liée ?

38voto

Serge Ballesta Points 12850

Le module gzip le prend en charge d'emblée : il suffit de déclarer un encodage et il codera la chaîne unicode en octets avant de l'écrire dans le fichier :

with gzip.open(write_file, 'wt', encoding="ascii") as zipfile:
   json.dump(data, zipfile)

Assurez-vous de préciser que vous utilisez le mode texte ( 'wt' ).

Comme json a encodé tout caractère non ascii, l'encodage ascii est suffisant, mais vous pouvez utiliser tout autre encodage compatible avec l'ascii pour les 128 premiers points de code, comme Latin1, UTF-8, etc.

0voto

pour convertir une chaîne de caractères en un tableau d'octets, vous pouvez faire quelque chose comme ceci

json.dump(bytes(data,"utf-8"), zipfile)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X