Як скинути dict у файл json?


239

У мене такий диктант:

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

Я не можу зрозуміти, як перенести дикт у jsonфайл, як показано нижче:

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

Чи є пітонічний спосіб це зробити?

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

Відповіді:


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

Це простіший спосіб зробити це.

У другому рядку коду файл result.jsonстворюється і відкривається як змінна fp.

У третьому рядку ваш диктант sampleзаписується у result.json!


1
@Danish Не знаю. Якщо вже немає запитань щодо вашої проблеми, вам слід створити нове питання, що описує вашу проблему. (btw, я просто редактор цих повідомлень)
парадокс Фермі

8
Порада: Якщо ви не хочете писати у файл, а бачити лише вихід, спробуйте перенаправити його на stdout: json.dump('SomeText', sys.stdout)
Аріндам Ройховдхурі

1
@ Dan-ish Ви пробували json.dump (sample, fp, sort_keys = False)? Якщо припустити, що я розумію, що ти маєш на увазі.
Кріс Ларсон

3
Тут добре пам’ятати, що, якщо ви не використовуєте OrderedDict(python> 2.7), немає гарантії, що ключі будуть замовлені певним чином
форд префект

1
Він кидає "dumps () займає 1 позиційний аргумент, але 2 отримали" помилку
Vijay Nirmal

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/


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)

Звичайно, навряд чи точно буде збережено порядок ... Але це лише природа словників ...


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)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.