Python 3, lire/écrire comprimé objets json à partir de/vers fichier gzip
Pour Python3, j'ai suivi @Martijn Pieters du code avec ceci:
import gzip
import json
# writing
with gzip.GzipFile(jsonfilename, 'w') as fout:
for i in range(N):
uid = "whatever%i" % i
dv = [1, 2, 3]
data = json.dumps({
'what': uid,
'where': dv})
fout.write(data + '\n')
mais cela entraîne une erreur:
Traceback (most recent call last):
...
File "C:\Users\Think\my_json.py", line 118, in write_json
fout.write(data + '\n')
File "C:\Users\Think\Anaconda3\lib\gzip.py", line 258, in write
data = memoryview(data)
TypeError: memoryview: a bytes-like object is required, not 'str'
Des idées sur ce qui se passe?
- Le code a été probablement écrit avec python2 à l'esprit. Essayez de coder les données:
(data+'\n').encode('utf-8')
. - Nope, même erreur.
Vous devez vous connecter pour publier un commentaire.
Vous avez quatre étapes de la transformation ici.
Prenons donc ces étapes une par une.
Notez que l'ajout d'
"\n"
est complètement inutile ici. Il ne casse pas tout, mais au-delà il n'est pas utilisé.Lecture fonctionne exactement à l'inverse:
Bien sûr, les étapes peuvent être combinées:
et
with open('data.json','r') as fid_json: # get json as type dict json_dict = json.load(fid_json) # convert dict to str json_str = str(json_dict)
json.load
au lieu deloads
comme justedata = json.load(fin)
json.load
peut (comme de Python 3.6) traitent de l'octet d'entrée. Mais il manque un moyen de spécifier l'encodage et l'hypothèse d'un défaut à la place. Depuis explicite est mieux qu'implicite, je préfère précisant les codages de moi-même. (Aussi je voulais garder l'équivalent de plus de l'échantillon ci-dessus).