Comment vider un dict dans un fichier json?

239

J'ai un dict comme celui-ci:

sample = {'ObjectInterpolator': 1629,  'PointInterpolator': 1675, 'RectangleInterpolator': 2042}

Je ne peux pas comprendre comment vider le dict dans un jsonfichier comme indiqué ci-dessous:

{      
    "name": "interpolator",
    "children": [
      {"name": "ObjectInterpolator", "size": 1629},
      {"name": "PointInterpolator", "size": 1675},
      {"name": "RectangleInterpolator", "size": 2042}
     ]
}

Existe-t-il un moyen pythonique de le faire?

Vous pouvez deviner que je veux générer un d3treemap.

holys
la source

Réponses:

413
import json
with open('result.json', 'w') as fp:
    json.dump(sample, fp)

C'est un moyen plus simple de le faire.

Dans la deuxième ligne de code, le fichier result.jsonest créé et ouvert en tant que variable fp.

Dans la troisième ligne, votre dict sampleest écrit dans le result.json!

moobi
la source
1
@Danish Je ne sais pas. À moins qu'il n'y ait déjà une question sur SO concernant votre problème, vous devez créer une nouvelle question décrivant votre problème. (btw, je suis simplement un éditeur de ces messages)
Fermi paradox
8
Astuce: Si vous ne voulez pas écrire dans un fichier et ne voir que la sortie, essayez de le rediriger vers stdout: json.dump('SomeText', sys.stdout)
Arindam Roychowdhury
1
@ Dan-ish Avez-vous essayé json.dump (sample, fp, sort_keys = False)? En supposant que je comprends ce que vous voulez dire.
Chris Larson
3
Une bonne chose à retenir ici est qu'à moins que vous n'utilisiez un OrderedDict(python> 2.7), il n'y a aucune garantie que les clés soient commandées d'une manière particulière
ford prefect
1
Il lance "dumps () prend 1 argument positionnel mais 2 ont été donnés" erreur
Vijay Nirmal
40

Combinez la réponse de @mgilson et @gnibbler, j'ai trouvé ce dont j'avais besoin:


d = {"name":"interpolator",
     "children":[{'name':key,"size":value} for key,value in sample.items()]}
j = json.dumps(d, indent=4)
f = open('sample.json', 'w')
print >> f, j
f.close()

De cette façon, j'ai obtenu un joli fichier json. Les astuces print >> f, jse trouvent ici: http://www.anthonydebarros.com/2012/03/11/generate-json-from-sql-using-python/

holys
la source
16
print(j, file=f)en Python 3.6 (au lieu de print >> f, j)
mjkrause
print(j, file=f)n'a pas fonctionné pour moi, je n'avais pas besoin de faire la partie J aussi. d = {'a':1, 'b':2} print(d, file=open('sample.json', 'wt'))travaillé.
HS Rathore
21
d = {"name":"interpolator",
     "children":[{'name':key,"size":value} for key,value in sample.items()]}
json_string = json.dumps(d)

Bien sûr, il est peu probable que l'ordre soit exactement préservé ... Mais c'est juste la nature des dictionnaires ...

mgilson
la source
6
json_string = json.dumps (d,, sort_keys = True) si l'ordre de tri est souhaité.
Chris Larson
13

Cela devrait vous donner un début

>>> import json
>>> print json.dumps([{'name': k, 'size': v} for k,v in sample.items()], indent=4)
[
    {
        "name": "PointInterpolator",
        "size": 1675
    },
    {
        "name": "ObjectInterpolator",
        "size": 1629
    },
    {
        "name": "RectangleInterpolator",
        "size": 2042
    }
]
John La Rooy
la source
1

avec un joli format d'impression:

import json

with open(path_to_file, 'w') as file:
    json_string = json.dumps(sample, default=lambda o: o.__dict__, sort_keys=True, indent=2)
    file.write(json_string)
jmhostalet
la source