Comment écrire des données JSON stockées dans le dictionnaire ? data
dans un fichier ?
f = open('data.json', 'wb')
f.write(data)
Cela donne l'erreur :
TypeError : doit être une chaîne de caractères ou un tampon, pas un dict.
Comment écrire des données JSON stockées dans le dictionnaire ? data
dans un fichier ?
f = open('data.json', 'wb')
f.write(data)
Cela donne l'erreur :
TypeError : doit être une chaîne de caractères ou un tampon, pas un dict.
Toutes les réponses précédentes sont correctes. Voici un exemple très simple :
#! /usr/bin/env python
import json
def write_json():
# create a dictionary
student_data = {"students":[]}
#create a list
data_holder = student_data["students"]
# just a counter
counter = 0
#loop through if you have multiple items..
while counter < 3:
data_holder.append({'id':counter})
data_holder.append({'room':counter})
counter += 1
#write the file
file_path='/tmp/student_data.json'
with open(file_path, 'w') as outfile:
print("writing file to: ",file_path)
# HERE IS WHERE THE MAGIC HAPPENS
json.dump(student_data, outfile)
outfile.close()
print("done")
write_json()
La réponse acceptée est bonne. Cependant, j'ai rencontré l'erreur "is not json serializable" en l'utilisant.
Voici comment je l'ai réparé avec open("file-name.json", 'w')
comme sortie :
output.write(str(response))
Bien qu'il ne s'agisse pas d'une bonne solution car le fichier json qu'il crée n'aura pas de guillemets doubles, c'est une bonne solution si vous cherchez un moyen rapide et efficace.
Les données JSON peuvent être écrites dans un fichier comme suit
hist1 = [{'val_loss': [0.5139984398465246],
'val_acc': [0.8002029867684085],
'loss': [0.593220705309384],
'acc': [0.7687131817929321]},
{'val_loss': [0.46456472964199463],
'val_acc': [0.8173602046780344],
'loss': [0.4932038113037539],
'acc': [0.8063946213802453]}]
Écrire dans un fichier :
with open('text1.json', 'w') as f:
json.dump(hist1, f)
Il s'agit juste d'une indication supplémentaire sur l'utilisation de l'option json.dumps
(ce n'est pas une réponse au problème de la question, mais une astuce pour ceux qui doivent vider les types de données numpy) :
S'il y a des types de données NumPy dans le dictionnaire, json.dumps()
nécessite un paramètre supplémentaire, les crédits vont à TypeError : L'objet de type 'ndarray' n'est pas sérialisable en JSON. et il corrigera également les erreurs telles que TypeError: Object of type int64 is not JSON serializable
et ainsi de suite :
class NumpyEncoder(json.JSONEncoder):
""" Special json encoder for np types """
def default(self, obj):
if isinstance(obj, (np.int_, np.intc, np.intp, np.int8,
np.int16, np.int32, np.int64, np.uint8,
np.uint16, np.uint32, np.uint64)):
return int(obj)
elif isinstance(obj, (np.float_, np.float16, np.float32,
np.float64)):
return float(obj)
elif isinstance(obj, (np.ndarray,)):
return obj.tolist()
return json.JSONEncoder.default(self, obj)
Et ensuite courir :
import json
#print(json.dumps(my_data[:2], indent=4, cls=NumpyEncoder)))
with open(my_dir+'/my_filename.json', 'w') as f:
json.dumps(my_data, indent=4, cls=NumpyEncoder)))
Vous pouvez également vouloir retourner une chaîne de caractères au lieu d'une liste dans le cas d'un np.array() car les tableaux sont imprimés sous forme de listes réparties sur plusieurs lignes, ce qui fera exploser la sortie si vous avez de grands ou de nombreux tableaux. L'inconvénient : il est plus difficile d'accéder aux éléments du dictionnaire vidés plus tard pour les récupérer dans le tableau original. Cependant, si cela ne vous dérange pas de n'avoir qu'une chaîne de caractères d'un tableau, cela rend le dictionnaire plus lisible. Alors échangez :
elif isinstance(obj, (np.ndarray,)):
return obj.tolist()
avec :
elif isinstance(obj, (np.ndarray,)):
return str(obj)
ou juste :
else:
return str(obj)
@user32882 Oui, cela m'a également étonné. Un tel point faible d'une norme telle que json.dumps. Il a été déclassé peut-être parce que personne ne s'attend à ce que ce soit si compliqué (moi y compris), et il ne répond pas vraiment à la question, mais dans mon cas, j'en avais besoin.
Veuillez consulter la réponse acceptée. Cela ne devrait pas prendre plus de quelques lignes de code.
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.
0 votes
Pour les drapeaux lors de l'ouverture du fichier : Ici, nous avons utilisé la lettre "w" dans notre argument, qui indique l'écriture et créera un fichier s'il n'existe pas dans la bibliothèque Le signe plus indique à la fois la lecture et l'écriture, guru99.com/lire-et-ecrire-des-fichiers-en-python.html#1