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.
Écriture de JSON dans un fichier
import json
data = {}
data['people'] = []
data['people'].append({
'name': 'Scott',
'website': 'stackabuse.com',
'from': 'Nebraska'
})
data['people'].append({
'name': 'Larry',
'website': 'google.com',
'from': 'Michigan'
})
data['people'].append({
'name': 'Tim',
'website': 'apple.com',
'from': 'Alabama'
})
with open('data.txt', 'w') as outfile:
json.dump(data, outfile)
Lecture de JSON à partir d'un fichier
import json
with open('data.txt') as json_file:
data = json.load(json_file)
for p in data['people']:
print('Name: ' + p['name'])
print('Website: ' + p['website'])
print('From: ' + p['from'])
print('')
Bienvenue sur Stack Overflow. Si vous décidez de répondre à une question plus ancienne dont les réponses sont bien établies et correctes, l'ajout d'une nouvelle réponse en fin de journée peut ne vous apporter aucun crédit. Si vous disposez d'informations nouvelles et pertinentes, ou si vous êtes convaincu que les autres réponses sont toutes fausses, vous pouvez ajouter une nouvelle réponse, mais une "énième réponse" donnant les mêmes informations de base longtemps après que la question a été posée ne vous donnera généralement pas beaucoup de crédit. (Vous montrez quelques échantillons de données ; c'est bien, mais je ne suis pas sûr que ce soit suffisant, d'autant plus que vous ne montrez pas ce qui est produit pour les échantillons de données).
Je n'ai pas assez de réputation pour ajouter dans les commentaires, donc je me contente d'écrire ici quelques-unes de mes découvertes de cette ennuyeuse TypeError :
En fait, je pense qu'il s'agit d'un bug dans l'application json.dump()
en Python 2 seulement - Il ne peut pas vider une donnée Python (dictionnaire / liste) contenant des caractères non-ASCII, même vous ouvrez le fichier avec le encoding = 'utf-8'
paramètre. (c'est-à-dire quoi que vous fassiez). Mais, json.dumps()
fonctionne à la fois sur Python 2 et 3.
Pour illustrer ceci, suite à la réponse de phihag : le code dans sa réponse se casse dans Python 2 avec une exception TypeError: must be unicode, not str
si data
contient des caractères non ASCII. (Python 2.7.6, Debian) :
import json
data = {u'\u0430\u0431\u0432\u0433\u0434': 1} #{u'': 1}
with open('data.txt', 'w') as outfile:
json.dump(data, outfile)
Il fonctionne cependant très bien dans Python 3.
Donnez des raisons lorsque vous affirmez que quelque chose est faux. Utilisez @nickname pour que la personne soit avertie. Vous ne pouvez pas écrire de commentaires, mais vous pouvez en lire. Comme je l'ai déjà indiqué dans ma réponse au premier commentaire, essayez de data = {'asdf': 1}
. Vous obtiendrez la fameuse TypeError
avec votre (deuxième) variante.
Concernant ensure_ascii
- il est nécessaire si vous voulez obtenir une "vraie" sortie utf8. Sans lui, vous aurez un ascii simple avec 6 octets par lettre russe, contre 2 octets par caractère avec ce drapeau.
@AntonyHatchkins Vous avez raison pour le unicode()
partie. Je viens de réaliser que pour io
dans Python 2, write()
besoins unicode
pas str
.
Cela fait la même chose que la réponse de @phihag, mais il n'est pas garanti que cela fonctionne à tout moment. Considérez un tel code : f = open('1.txt', 'w'); f.write('a'); input()
. Exécutez-le et ensuite SYGTERM le ( Ctrl-Z
puis kill %1
sur linux, Ctrl-Break
sur Windows). 1.txt
aura 0 octet. C'est parce que l'écriture a été mise en mémoire tampon et que le fichier n'a été ni vidé ni fermé au moment où le SYGTERM s'est produit. with
garantit que le fichier sera toujours fermé, comme le fait le bloc 'try/finally', mais en plus court.
Pour écrire le JSON avec indentation, "pretty print" :
import json
outfile = open('data.json')
json.dump(data, outfile, indent=4)
De plus, si vous devez déboguer un JSON mal formaté et que vous souhaitez obtenir un message d'erreur utile, utilisez la fonction import simplejson
au lieu de import json
(les fonctions doivent être les mêmes)
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