Как вывести DICT в файл JSON?

239

У меня есть что-то вроде этого:

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

Я не могу понять, как вывести DICT в jsonфайл, как показано ниже:

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

Есть ли питонский способ сделать это?

Вы можете догадаться, что я хочу создать d3древовидную карту.

holys
источник

Ответы:

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

Это более простой способ сделать это.

Во второй строке кода файл result.jsonсоздается и открывается как переменная fp.

В третьей строке ваш диктант sampleзаписывается в result.json!

moobi
источник
1
@ Датский Не знаю. Если в SO нет вопроса о вашей проблеме, вы должны создать новый вопрос, описывающий вашу проблему. (кстати, я просто редактор этих сообщений)
парадокс Ферми
8
Совет: Если вы не хотите записывать в файл, а видите только выходные данные, попробуйте перенаправить его в stdout: json.dump('SomeText', sys.stdout)
Arindam Roychowdhury
1
@ Dan-ish Вы пробовали json.dump (sample, fp, sort_keys = False)? Предполагая, что я понимаю, что вы имеете в виду.
Крис Ларсон
3
Здесь следует помнить, что если вы не используете OrderedDict(python> 2.7), нет гарантии, что ключи упорядочены каким-либо особым образом
префект ford
1
Он выдает «dumps () принимает 1 позиционный аргумент, но 2 были даны» ошибка
Виджай Нирмал
40

Объединив ответ @mgilson и @gnibbler, я нашел следующее:


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

Таким образом, я получил файл JSON для печати. Трюки print >> f, jможно найти здесь: http://www.anthonydebarros.com/2012/03/11/generate-json-from-sql-using-python/

holys
источник
16
print(j, file=f)в Python 3.6 (вместо print >> f, j)
mjkrause
print(j, file=f)не работал для меня, мне не нужно было делать также и J-часть. d = {'a':1, 'b':2} print(d, file=open('sample.json', 'wt'))работал.
HS Rathore
21
d = {"name":"interpolator",
     "children":[{'name':key,"size":value} for key,value in sample.items()]}
json_string = json.dumps(d)

Конечно, вряд ли порядок будет точно сохранен ... Но это только характер словарей ...

mgilson
источник
6
json_string = json.dumps (d, sort_keys = True), если требуется отсортированный порядок.
Крис Ларсон
13

Это должно дать вам начало

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

с красивым форматом печати:

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
источник