Como despejar um dict em um arquivo json?

239

Eu tenho um ditado como este:

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

Não consigo descobrir como despejar o dict em um jsonarquivo, como mostrado abaixo:

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

Existe uma maneira pitônica de fazer isso?

Você pode adivinhar que eu quero gerar um d3mapa de árvore.

holys
fonte

Respostas:

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

Essa é uma maneira mais fácil de fazer isso.

Na segunda linha de código, o arquivo result.jsoné criado e aberto como a variável fp.

Na terceira linha, seu ditado sampleé gravado no arquivo result.json!

moobi
fonte
1
@ Danish Não sei. A menos que já exista uma pergunta no SO sobre o seu problema, você deve criar uma nova pergunta descrevendo o seu problema. (btw, sou simplesmente um editor dessas postagens)
Paradoxo de Fermi
8
Dica: Se você não deseja gravar em um arquivo e apenas visualizar a saída, tente redirecioná-lo para stdout: json.dump('SomeText', sys.stdout)
Arindam Roychowdhury
1
@ Dan-ish Você já tentou o json.dump (exemplo, fp, sort_keys = False)? Supondo que eu entenda o que você quer dizer.
Chris Larson
3
É bom lembrar aqui que, a menos que você use um OrderedDict(python> 2.7), não há garantia de que as chaves sejam ordenadas de uma maneira específica
ford prefect
1
Ele lança "dumps () leva 1 argumento posicional, mas 2 foram dados" erro
Vijay Nirmal
40

Combine a resposta de @mgilson e @gnibbler, encontrei o que preciso era o seguinte:


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()

Dessa forma, recebi um arquivo json de impressão bonita. Os truquesprint >> f, j ser encontrados aqui: http://www.anthonydebarros.com/2012/03/11/generate-json-from-sql-using-python/

holys
fonte
16
print(j, file=f)em Python 3.6 (em vez de print >> f, j)
mjkrause
print(j, file=f)não funcionou para mim, eu não precisava fazer a parte J também. d = {'a':1, 'b':2} print(d, file=open('sample.json', 'wt'))trabalhou.
HS Rathore
21
d = {"name":"interpolator",
     "children":[{'name':key,"size":value} for key,value in sample.items()]}
json_string = json.dumps(d)

Claro, é improvável que a ordem seja exatamente preservada ... Mas essa é apenas a natureza dos dicionários ...

mgilson
fonte
6
json_string = json.dumps (d,, sort_keys = True) se a ordem classificada for desejada.
Chris Larson
13

Isso deve lhe dar um começo

>>> 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
fonte
1

com formato de impressão 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)
jmhostalet
fonte