¿Cómo volcar un dict a un archivo json?


239

Tengo un dict como este:

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

No puedo entender cómo volcar el dict a un jsonarchivo como se muestra a continuación:

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

¿Hay una manera pitónica de hacer esto?

Puedes adivinar que quiero generar un d3mapa de árbol.

Respuestas:


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

Esta es una manera más fácil de hacerlo.

En la segunda línea de código, el archivo result.jsonse crea y se abre como la variable fp.

En la tercera línea, su dict samplese escribe en el result.json!


1
@ Danish No lo sé. A menos que ya haya una pregunta sobre SO sobre su problema, debe crear una nueva pregunta que describa su problema. (por cierto, soy simplemente un editor de esas publicaciones)
paradoja de Fermi

8
Consejo: Si no desea escribir en un archivo y solo ve el resultado, intente redirigirlo a stdout: json.dump('SomeText', sys.stdout)
Arindam Roychowdhury

1
@ Dan-ish ¿Has probado json.dump (sample, fp, sort_keys = False)? Suponiendo que entiendo lo que quieres decir.
Chris Larson

3
Es bueno recordar aquí que, a menos que use un OrderedDict(python> 2.7), no hay garantía de que las claves se ordenen de manera particular
prefecto


40

Combine la respuesta de @mgilson y @gnibbler, encontré que lo que necesitaba era esto:


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 esta manera, obtuve un archivo json con una bonita impresión. Los trucos print >> f, jse encuentran desde aquí: http://www.anthonydebarros.com/2012/03/11/generate-json-from-sql-using-python/


16
print(j, file=f)en Python 3.6 (en lugar de print >> f, j)
mjkrause

print(j, file=f)no funcionó para mí, no necesitaba hacer la parte J también. d = {'a':1, 'b':2} print(d, file=open('sample.json', 'wt'))trabajó.
HS Rathore

21
d = {"name":"interpolator",
     "children":[{'name':key,"size":value} for key,value in sample.items()]}
json_string = json.dumps(d)

Por supuesto, es poco probable que el orden se conserve exactamente ... Pero esa es solo la naturaleza de los diccionarios ...


66
json_string = json.dumps (d`` sort_keys = True) si se desea el orden ordenado.
Chris Larson

13

Esto debería darte un comienzo

>>> 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
    }
]

1

con formato de impresión bonita:

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)
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.