741

Tôi có một tệp JSON là một mớ hỗn độn mà tôi muốn in đẹp-- cách dễ nhất để làm điều này trong python là gì? Tôi biết PrettyPrint lấy một "đối tượng", mà tôi nghĩ có thể là một tệp, nhưng tôi không biết làm thế nào để truyền tệp vào - chỉ sử dụng tên tệp không hoạt động.

|
1.1k

Các jsonmô-đun đã thực hiện một số in ấn cơ bản với indenttham số:

>>> import json
>>>
>>> your_json = '["foo", {"bar":["baz", null, 1.0, 2]}]'
>>> parsed = json.loads(your_json)
>>> print(json.dumps(parsed, indent=4, sort_keys=True))
[
    "foo", 
    {
        "bar": [
            "baz", 
            null, 
            1.0, 
            2
        ]
    }
]

Để phân tích một tệp, sử dụng json.load():

with open('filename.txt', 'r') as handle:
    parsed = json.load(handle)
|
240

Bạn có thể làm điều này trên dòng lệnh:

python3 -m json.tool < some.json

(như đã được đề cập trong phần bình luận cho câu hỏi, cảm ơn @Kai Petzke về đề xuất python3).

Trên thực tế python không phải là công cụ yêu thích của tôi khi có liên quan đến xử lý json trên dòng lệnh. Đối với in ấn đơn giản là ok, nhưng nếu bạn muốn thao tác json, nó có thể trở nên quá phức tạp. Bạn sẽ sớm cần phải viết một tệp script riêng biệt, bạn có thể kết thúc bằng các bản đồ có các khóa là u "some-key" (python unicode), khiến việc chọn các trường khó khăn hơn và không thực sự đi theo hướng đẹp in dấu.

Tôi sử dụng jq . Trên đây có thể được thực hiện với:

jq '' < some.json

và bạn có được màu sắc như một phần thưởng (và cách dễ dàng mở rộng hơn).

|
  • 1

    JQ là tuyệt vời nhưng có một giới hạn tối đa vì vậy nó vô dụng đối với các tệp lớn. (tức là thổi lên xử lý tệp 1,15mb) github.com/stedolan/jq/issues/1041

    – Hoàng Gia Linh 08:35:34 17/05/2016
  • 1

    vâng, chắc chắn, nếu bạn đang viết các bộ lọc jq với hơn 10 nghìn dòng mã tôi nghĩ bạn đang thử một cái gì đó như đi đến sao hỏa bằng xe đạp.

    – Ngô Duy Hoàng 08:39:12 17/05/2016
  • 1

    lol: D @ gismo-ranas Phiên bản json.tool được chuyển đến một tệp hoạt động thực sự tốt trên các tệp lớn; và là ngu ngốc nhanh chóng. Tôi thích JQ nhưng định dạng bất cứ thứ gì ngoài một tải trọng nhỏ (mà bạn có thể làm trong hầu hết các trình soạn thảo văn bản) nằm ngoài khả năng của nó :) Ngoài ra ngẫu nhiên: json-generator.com là một công cụ gọn gàng để tạo dữ liệu thử nghiệm

    – Hoàng Diễm Phước 08:46:18 17/05/2016
  • 1

    hoặc chỉ:jq '' < some.json

    – Bùi Bảo Hoàng 19:21:49 09/12/2016
  • 1

    Trên thực tế tôi thực sự khuyên bạn nên sử dụng python3 -m json.tool <IN >OUT, vì điều này sẽ giữ thứ tự ban đầu của các trường trong các ký tự JSON. Trình thông dịch python phiên bản 2 sắp xếp các trường theo thứ tự tăng dần theo thứ tự bảng chữ cái, thường không phải là những gì bạn muốn.

    – Dương Viết Nhân 17:00:25 20/01/2019
44

Pyributionize + Python json.tool = In đẹp với tô sáng cú pháp

Pyributionize là một công cụ giết người. Xem cái này

Tôi kết hợp python json.tool với pyributionize

echo '{"foo": "bar"}' | python -m json.tool | pygmentize -l json

Xem liên kết ở trên để biết hướng dẫn cài đặt pyributionize.

Một bản demo của điều này là trong hình dưới đây:

|
  • 1

    Trong ví dụ của bạn -gkhông thực sự hoạt động;) Vì đầu vào đến từ stdin, pyributionize không thể đưa ra dự đoán tốt. Bạn cần xác định rõ ràng từ vựng:echo '{"foo": "bar"}' | python -m json.tool | pygmentize -l json

    – Hoàng Gia Linh 13:00:55 29/01/2018
  • 1

    @DenisTheMenace Nó được sử dụng để làm việc vào năm 2015 khi tôi tạo hình ảnh ví dụ này. Nó dường như không hoạt động trên hệ thống của tôi.

    – Ngô Duy Hoàng 09:19:56 30/01/2018
31

Bạn có thể sử dụng pprint modul tích hợp .

Làm thế nào bạn có thể đọc các tập tin với dữ liệu json và in nó ra.

import json
import pprint

with open('filename.txt', 'r') as f:
    data = f.read()
    json_data = json.loads(data)

pprint.pprint(json_data)
|
  • 1

    Vấn đề với điều này là pprint sẽ sử dụng dấu ngoặc kép và dấu ngoặc kép thay thế cho nhau, nhưng json chỉ yêu cầu dấu ngoặc kép, vì vậy json có dấu của bạn có thể không còn phân tích thành json hợp lệ.

    – Tạ Thế An 14:38:46 29/06/2018
  • 1

    Có, nhưng nó chỉ xuất ra một tệp json. Không nhận đầu ra và viết lại trong một tập tin.

    – Tạ Bằng Sơn 14:01:42 09/07/2018
31

Sử dụng chức năng này và không cần phải nhớ rằng JSON của bạn là một lần nữa strhay không dict- chỉ cần nhìn vào bản in đẹp:

import json

def pp_json(json_thing, sort=True, indents=4):
    if type(json_thing) is str:
        print(json.dumps(json.loads(json_thing), sort_keys=sort, indent=indents))
    else:
        print(json.dumps(json_thing, sort_keys=sort, indent=indents))
    return None

pp_json(your_json_string_or_dict)
|
8

Để có thể in đẹp từ dòng lệnh và có thể kiểm soát thụt lề, v.v. bạn có thể thiết lập một bí danh tương tự như sau:

alias jsonpp="python -c 'import sys, json; print json.dumps(json.load(sys.stdin), sort_keys=True, indent=2)'"

Và sau đó sử dụng bí danh theo một trong những cách sau:

cat myfile.json | jsonpp
jsonpp < myfile.json
|
4

Đây là một ví dụ đơn giản về việc in JSON đẹp lên bàn điều khiển theo cách hay trong Python, mà không yêu cầu JSON phải có trên máy tính của bạn dưới dạng tệp cục bộ:

import pprint
import json 
from urllib.request import urlopen # (Only used to get this example)

# Getting a JSON example for this example 
r = urlopen("https://mdn.github.io/fetch-examples/fetch-json/products.json")
text = r.read() 

# To print it
pprint.pprint(json.loads(text))
|
1

Sử dụng pprint: https://docs.python.org/3.6/l Library / pprint.html

import pprint
pprint.print(json)

So sánh print()vớipprint.pprint()

print(json)
{'feed': {'title': 'W3Schools Home Page', 'title_detail': {'type': 'text/plain', 'language': None, 'base': '', 'value': 'W3Schools Home Page'}, 'links': [{'rel': 'alternate', 'type': 'text/html', 'href': 'https://www.w3schools.com'}], 'link': 'https://www.w3schools.com', 'subtitle': 'Free web building tutorials', 'subtitle_detail': {'type': 'text/html', 'language': None, 'base': '', 'value': 'Free web building tutorials'}}, 'entries': [], 'bozo': 0, 'encoding': 'utf-8', 'version': 'rss20', 'namespaces': {}}

pprint.pprint(json)
{'bozo': 0,
 'encoding': 'utf-8',
 'entries': [],
 'feed': {'link': 'https://www.w3schools.com',
          'links': [{'href': 'https://www.w3schools.com',
                     'rel': 'alternate',
                     'type': 'text/html'}],
          'subtitle': 'Free web building tutorials',
          'subtitle_detail': {'base': '',
                              'language': None,
                              'type': 'text/html',
                              'value': 'Free web building tutorials'},
          'title': 'W3Schools Home Page',
          'title_detail': {'base': '',
                           'language': None,
                           'type': 'text/plain',
                           'value': 'W3Schools Home Page'}},
 'namespaces': {},
 'version': 'rss20'}
|

Câu trả lời của bạn (> 20 ký tự)

Bằng cách click "Đăng trả lời", bạn đồng ý với Điều khoản dịch vụ, Chính sách bảo mật and Chính sách cookie của chúng tôi.

Không tìm thấy câu trả lời bạn tìm kiếm? Duyệt qua các câu hỏi được gắn thẻ hoặc hỏi câu hỏi của bạn.