JSON 파일을 인쇄하는 방법?


1059

파이썬 파일에서 이것을 가장 쉽게 만드는 방법은 무엇입니까? PrettyPrint는 파일이 될 수 있다고 생각되는 "객체"를 사용하지만 파일을 전달하는 방법을 모르겠습니다. 파일 이름만으로는 작동하지 않습니다.


9
json.loads()결과 사전을 사용하여 JSON을 구문 분석 하고 예쁘게 인쇄하십시오. 또는 에 대한 Python 문서Pretty printing 섹션으로 건너 뛰십시오 . json
Blender


1
@Blender 답변을 게시하면 크레딧을 줄 것입니다 ... 솔루션이 동일하기 때문에 복제본으로 폐쇄 될 수 있지만 질문이 다르므로 아마도 그렇지 않습니다.
Colleen

18
<your_file.js python -mjson.tool@ed의 링크에서와 같이 왜 그렇지 않습니까?
jfs

11
커맨드 라인에서 예쁘게 인쇄하는 것은 파이썬으로 프로그래밍 방식으로 예쁘게 인쇄하는 것과 같지 않기 때문에 중복이라고 생각하지 않습니다. 재개 투표.
vitaut

답변:


1657

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)

142
간단한 예쁜 인쇄를 위해 이것은 명시적인 파싱 없이도 작동합니다 :print json.dumps(your_json_string, indent=4)
Peterino

1
들여 쓰기는 무엇을합니까?
timbram 2016 년

8
@timbram : 들여 쓰기 할 공백의 수입니다.
Blender

9
들여 쓰기가 없으면 한 줄의 못생긴 텍스트가 생겨서 여기에 왔습니다.
krs013

6
내가 먼저 JSON 문자열을 구문 분석했다 @Peterino : print(json.dumps(json.loads(your_json_string), indent=2))그렇지 않으면 그것은 단지 나에게 이스케이프 문자열을 보여 주었다
vladkras

310

명령 행에서이를 수행 할 수 있습니다.

python3 -m json.tool some.json

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

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

jq를 사용할 수도 있습니다 .

jq . some.json

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

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


4
JQ는 훌륭하지만 최대 한계가 있으므로 큰 파일에는 쓸모가 없습니다. (즉,이 1.15mb 파일을 처리 불면) github.com/stedolan/jq/issues/1041
크리스 맥키

3
예, 10K가 넘는 코드로 jq 필터를 작성하는 경우 자전거로 화성에가는 것과 같은 것을 시도하고 있다고 생각합니다.
Gismo Ranas

2
lol : D @ gismo-ranas 파일로 파이프 된 json.tool 버전은 큰 파일에서 실제로 잘 작동합니다. 어리석게 빠릅니다. 나는 JQ를 좋아하지만 작은 페이로드 (대부분의 텍스트 편집기에서 할 수있는) 이외의 형식은 도달 할 수 없습니다 :) 무작위 추가 : json-generator.com 은 테스트 데이터를 만드는 깔끔한 도구입니다.
Chris McKee

5
또는 그냥 :jq '' < some.json
fatal_error

2
실제로 python3 -m json.tool <IN >OUTJSON dicts에서 필드의 원래 순서를 유지하므로을 사용하는 것이 좋습니다 . 파이썬 인터프리터 버전 2는 필드를 알파벳순으로 오름차순으로 정렬합니다.
Kai Petzke

55

내장 모듈 pprint (https://docs.python.org/3.6/library/pprint.html)를 사용할 수 있습니다 .

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

import json
import pprint

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

pprint.pprint(json_data)

4
이것의 문제는 pprint가 작은 따옴표와 큰 따옴표를 교환 할 수 있지만, json은 큰 따옴표 만 필요하므로 pprinted json은 더 이상 유효한 json으로 구문 분석되지 않을 수 있다는 것입니다.
drevicko

1
예,하지만 json 파일 만 출력하면됩니다. 출력을 가져 와서 파일에 다시 쓰지 마십시오.
ikreb

52

Pygmentize + Python json.tool = 구문 강조를 사용한 예쁜 인쇄

Pygmentize는 살인자 도구입니다. 이것 좀 봐.

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

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

피그먼트 설치 지침은 위의 링크를 참조하십시오.

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

데모


1
귀하의 예에서는 -g실제로 작동하지 않습니다.) 입력은 stdin에서 가져 오기 때문에 pygmentize는 좋은 추측을 할 수 없습니다. lexer를 명시 적으로 지정해야합니다.echo '{"foo": "bar"}' | python -m json.tool | pygmentize -l json
Denis The Menace

1
@DenisTheMenace이 예제 이미지를 만들 때 2015 년에 작동했습니다. 내 시스템에서도 작동하지 않는 것 같습니다.
Shubham Chaudhary

36

이 기능을 사용하여 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)

14

한때 prettyjson()멋진 출력을 생성 하는 함수를 작성했습니다 . 이 저장소 에서 구현을 가져올 수 있습니다 .

이 기능의 주요 기능은 특정 항목에 maxlinelength도달 할 때까지 한 줄에 dict 및 list 항목을 유지하려고 시도하는 것 입니다. 이렇게하면 JSON 줄이 줄어들고 출력이 더 작고 읽기 쉽습니다.

예를 들어 다음과 같은 종류의 출력을 생성 할 수 있습니다.

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

UPD Dec'19 : 코드를 별도의 repo에 배치하고 몇 가지 버그를 수정하고 몇 가지 다른 수정 작업을 수행했습니다.


나는이 포맷터가 제안 된 것 중 최고라고 생각하며 더 많은 투표를해야합니다.
thorhunter 2009 년

13

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

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

11

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

pprint유효한 JSON 문서를 생성하지 않습니다.
selurvedu

5

다음은 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))

파이썬 3에서 다음과 같은 오류 메시지가 나타납니다. "TypeError : JSON 객체는 '바이트'가 아닌 str이어야합니다."
Mr. T

3
def saveJson(date,fileToSave):
    with open(fileToSave, 'w+') as fileToSave:
        json.dump(date, fileToSave, ensure_ascii=True, indent=4, sort_keys=True)

파일을 표시하거나 저장합니다.


1

오류를 피하기 위해 json을 구문 분석하는 것이 좋습니다.

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

1

pprintjson 시도 할 수 있습니다.


설치

$ pip3 install pprintjson

용법

pprintjson CLI를 사용하여 파일에서 JSON을 인쇄하십시오.

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

pprintjson CLI를 사용하여 stdin에서 JSON을 인쇄하십시오.

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

pprintjson CLI를 사용하여 문자열에서 JSON을 인쇄하십시오.

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

들여 쓰기가 1 인 문자열에서 JSON을 인쇄하십시오.

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

문자열에서 JSON을 인쇄하고 출력을 파일 output.json에 저장하십시오.

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

산출

여기에 이미지 설명을 입력하십시오


0

완벽하지는 않지만 일을합니다.

data = data.replace(',"',',\n"')

당신은 그것을 개선하고 들여 쓰기 등을 추가 할 수 있지만 더 깨끗한 JSON을 읽으려면이 방법입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.