program story

JSON 파일을 prettyprint하는 방법은 무엇입니까?

inputbox 2020. 9. 28. 09:03
반응형

JSON 파일을 prettyprint하는 방법은 무엇입니까?


내가 prettyprint하고 싶은 엉망인 JSON 파일이 있는데 파이썬에서 이것을 수행하는 가장 쉬운 방법은 무엇입니까? PrettyPrint가 파일이라고 생각하는 "객체"를 사용한다는 것을 알고 있지만 파일을 전달하는 방법을 모릅니다. 파일 이름을 사용하는 것만으로는 작동하지 않습니다.


json모듈은 이미 몇 가지 기본 꽤 인쇄 구현 indent매개 변수를 :

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

파일을 구문 분석하려면 다음을 사용하십시오 json.load().

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

명령 줄에서이 작업을 수행 할 수 있습니다.

python3 -m json.tool < some.json

(이미 질문에 대한 주석에서 언급했듯이 python3 제안에 대한 @Kai Petzke 덕분에).

실제로 파이썬은 명령 줄에서 json 처리에 관한 한 제가 가장 좋아하는 도구가 아닙니다. 단순한 예쁜 인쇄의 경우 괜찮지 만 json을 조작하려면 지나치게 복잡해질 수 있습니다. 곧 별도의 스크립트 파일을 작성해야합니다. 키가 u "some-key"(python unicode) 인 맵으로 끝날 수 있습니다.이 맵은 필드 선택을 더 어렵게 만들고 실제로 예쁜 방향으로 가지 않습니다. -인쇄.

나는 jq를 사용 합니다. 위의 작업은 다음으로 수행 할 수 있습니다.

jq . some.json

그리고 당신은 보너스로 색상을 얻습니다 (그리고 훨씬 더 쉬운 확장 성).

부록 : 한편으로는 큰 JSON 파일을 처리하기 위해 jq를 사용하고 다른 한편으로는 매우 큰 jq 프로그램을 사용하는 것에 대한 의견에 약간의 혼란이 있습니다. 하나의 큰 JSON 엔티티로 구성된 파일을 예쁘게 인쇄하는 경우 실제 제한은 RAM입니다. 실제 데이터의 단일 배열로 구성된 2GB 파일을 pretty-printing하는 경우 pretty-printing에 필요한 "최대 상주 세트 크기"는 5GB (jq 1.5 또는 1.6 사용 여부)였습니다. 또한 jq는 pip install jq.


Pygmentize + Python json.tool = 구문 강조 표시가있는 예쁜 인쇄

Pygmentize는 킬러 도구입니다. 이것 좀 봐.

python json.tool을 pygmentize와 결합합니다.

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

pygmentize 설치 지침은 위의 링크를 참조하십시오.

이에 대한 데모는 아래 이미지에 있습니다.

데모


내장 된 modul pprint를 사용할 수 있습니다 .

json 데이터로 파일을 읽고 인쇄하는 방법.

import json
import pprint

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

pprint.pprint(json_data)

이 기능을 사용하고 JSON이 str또는 dict다시 인지 기억할 필요가 없습니다 . 예쁜 인쇄물을보세요.

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)

명령 줄에서 예쁘게 인쇄하고 들여 쓰기 등을 제어 할 수 있으려면 다음과 유사한 별칭을 설정할 수 있습니다.

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

그런 다음 다음 방법 중 하나로 별칭을 사용합니다.

cat myfile.json | jsonpp
jsonpp < myfile.json

pprint 사용 : https://docs.python.org/3.6/library/pprint.html

import pprint
pprint.pprint(json)

print() 에 비해 pprint.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'}

다음은 JSON이 컴퓨터에 로컬 파일로있을 필요없이 Python에서 멋진 방식으로 콘솔에 JSON을 인쇄하는 간단한 예제입니다.

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

I once wrote a prettyjson() function to produce nice-looking output. You can grab the implementation from this repo.

The main feature of this function is it tries keep dict and list items in one line until a certain maxlinelength is reached. This produces fewer lines of JSON, the output looks more compact and easier to read.

You can produce this kind of output for instance:

{
  "grid": {"port": "COM5"},
  "policy": {
    "movingaverage": 5,
    "hysteresis": 5,
    "fan1": {
      "name": "CPU",
      "signal": "cpu",
      "mode": "auto",
      "speed": 100,
      "curve": [[0, 75], [50, 75], [75, 100]]
    }
}

I think that's better to parse the json before, to avoid errors:

def format_response(response):
    try:
        parsed = json.loads(response.text)
    except JSONDecodeError:
        return response.text
    return json.dumps(parsed, ensure_ascii=True, indent=4)

You could try pprintjson.


Installation

$ pip3 install pprintjson

Usage

Pretty print JSON from a file using the pprintjson CLI.

$ pprintjson "./path/to/file.json"

Pretty print JSON from a stdin using the pprintjson CLI.

$ echo '{ "a": 1, "b": "string", "c": true }' | pprintjson

Pretty print JSON from a string using the pprintjson CLI.

$ pprintjson -c '{ "a": 1, "b": "string", "c": true }'

Pretty print JSON from a string with an indent of 1.

$ pprintjson -c '{ "a": 1, "b": "string", "c": true }' -i 1

Pretty print JSON from a string and save output to a file output.json.

$ pprintjson -c '{ "a": 1, "b": "string", "c": true }' -o ./output.json

Output

여기에 이미지 설명 입력

참고 URL : https://stackoverflow.com/questions/12943819/how-to-prettyprint-a-json-file

반응형