Làm thế nào để đổ một dict vào một tập tin json?


237

Tôi có một câu lệnh như thế này:

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

Tôi không thể tìm ra cách đổ dict vào một jsontệp như dưới đây:

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

Có một cách pythonic để làm điều này?

Bạn có thể đoán rằng tôi muốn tạo một bản đồ d3tre.

Câu trả lời:


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

Đây là một cách dễ dàng hơn để làm điều đó.

Trong dòng mã thứ hai, tệp result.jsonđược tạo và mở dưới dạng biến fp.

Trong dòng thứ ba, dict của bạn sampleđược viết vào result.json!


1
@D Biến Đừng biết. Trừ khi đã có câu hỏi về SO về vấn đề của bạn, bạn nên tạo một câu hỏi mới mô tả vấn đề của bạn. (btw, tôi chỉ đơn giản là một biên tập viên của những bài đăng đó)
Nghịch lý Fermi

8
Mẹo: Nếu bạn không muốn ghi vào một tệp và chỉ nhìn thấy đầu ra, hãy thử chuyển hướng nó đến stdout: json.dump('SomeText', sys.stdout)
Arindam Roychowdhury

1
@ Dan-ish Bạn đã thử json.dump (mẫu, fp, sort_keys = Sai) chưa? Giả sử tôi hiểu ý của bạn.
Chris Larson

3
Điều tốt cần nhớ ở đây là trừ khi bạn sử dụng OrderedDict(python> 2.7), không có gì đảm bảo rằng các khóa được sắp xếp theo bất kỳ cách cụ thể nào
ford hoàn thành vào

1
Nó ném lỗi "dumps () mất 1 đối số vị trí nhưng 2 lỗi được đưa ra"
Vijay Nirmal

40

Kết hợp câu trả lời của @mgilson và @gnibbler, tôi tìm thấy thứ tôi cần là đây:


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

Bằng cách này, tôi đã nhận được một tập tin json in đẹp. Các thủ thuật print >> f, jđược tìm thấy từ đây: http://www.anthonydebarros.com/2012/03/11/generate-json-from-sql-USE-python/


16
print(j, file=f)trong Python 3.6 (thay vì print >> f, j)
mjkrause

print(j, file=f)không làm việc cho tôi, tôi cũng không cần phải làm phần J. d = {'a':1, 'b':2} print(d, file=open('sample.json', 'wt'))đã làm việc.
HS Rathore

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

Tất nhiên, không chắc là trật tự sẽ được bảo tồn chính xác ... Nhưng đó chỉ là bản chất của từ điển ...


6
json_opes = json.dumps (d ,, sort_keys = True) nếu muốn sắp xếp thứ tự.
Chris Larson

13

Điều này sẽ cho bạn một sự khởi đầu

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

với định dạng in đẹp:

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)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.