¿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.