programing

JSON 파일을 예쁘게 인쇄하는 방법

kingscode 2023. 1. 2. 23:08
반응형

JSON 파일을 예쁘게 인쇄하는 방법

Python에서 JSON 파일을 예쁘게 인쇄하려면 어떻게 해야 하나요?

하다를 사용하세요.indent=들여쓰기 기준 공간 수를 지정하기 위한 매개 변수 또는 매개 변수:

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

파일을 해석하려면 다음 명령을 사용합니다.

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

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

python3 -m json.tool some.json

(질문에 대한 코멘트에서 이미 언급했듯이 python3를 제안해 주신 @Kai Petzke 덕분입니다).

사실 python은 명령줄에서의 json 처리에 관한 한 제가 좋아하는 툴이 아닙니다.심플하고 예쁜 인쇄라면 괜찮지만, json을 조작하고 싶은 경우, 너무 복잡해질 수 있습니다.곧 별도의 스크립트 파일을 작성해야 합니다.키 키가 u"some-key"(python unicode)인 맵이 생성될 수 있습니다.이 맵은 필드 선택이 어려워지고 인쇄가 잘 되지 않습니다.

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

jq . some.json

색상도 덤으로 받을 수 있습니다(확장성도 훨씬 용이합니다).

: :하여 큰 하는 것에 대해 .큰 JSON 파일을 처리하기 위해 jq를 사용하는 것과 매우 큰 jq 프로그램을 사용하는 것에 대한 코멘트에 혼선이 있습니다.단일 대형 JSON 엔티티로 구성된 파일을 예쁘게 인쇄할 경우 실제 제한사항은 RAM입니다.실제 데이터의 단일 어레이로 구성된 2GB 파일을 예쁘게 인쇄할 경우 예쁘게 인쇄할 때 필요한 "최대 상주 세트 크기"는 5GB였습니다(jq 1.5 또는 1.6 사용 여부).에서 python의 jq를 의 뒤에 사용할 수 있습니다.pip install jq.

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

json 데이터가 있는 파일을 읽고 출력하는 방법.

import json
import pprint

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

print(json_data)
{"firstName": "John", "lastName": "Smith", "isAlive": "true", "age": 27, "address": {"streetAddress": "21 2nd Street", "city": "New York", "state": "NY", "postalCode": "10021-3100"}, 'children': []}

pprint.pprint(json_data)
{'address': {'city': 'New York',
             'postalCode': '10021-3100',
             'state': 'NY',
             'streetAddress': '21 2nd Street'},
 'age': 27,
 'children': [],
 'firstName': 'John',
 'isAlive': True,
 'lastName': 'Smith'}

pprint는 작은따옴표를 사용하며 json 규격에는 큰따옴표가 필요하므로 출력은 올바른 json이 아닙니다.

예쁜 인쇄 형식의 json을 파일로 다시 쓰려면 pprint.pormat을 사용해야 합니다.

pretty_print_json = pprint.pformat(json_data).replace("'", '"')

with open('file_name.json', 'w') as f:
    f.write(pretty_print_json)

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

파그멘테이션은 킬러 도구입니다.이것 좀 봐.

나는 python json을 결합한다.파지멘테이션이 있는 공구

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

Pygmentize 의 인스톨 순서에 대해서는, 위의 링크를 참조해 주세요.

이에 대한 데모는 다음 그림에 나와 있습니다.

데모

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

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

명령줄에서 예쁘게 인쇄하여 들여쓰기 등을 제어할 수 있도록 합니다.다음과 같은 에일리어스를 설정할 수 있습니다.

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
def saveJson(date,fileToSave):
    with open(fileToSave, 'w+') as fileToSave:
        json.dump(date, fileToSave, ensure_ascii=True, indent=4, sort_keys=True)

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

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

프프린츠슨 한번 써보세요.


인스톨

$ 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

산출량

여기에 이미지 설명 입력

오류를 피하기 위해 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)

로깅을 위해 json 파일의 내용을 덤프해야 하는 비슷한 요건이 있었습니다.

print(json.dumps(json.load(open(os.path.join('<myPath>', '<myjson>'), "r")), indent = 4 ))

자주 사용하는 경우는, 기능에 넣습니다.

def pp_json_file(path, file):
    print(json.dumps(json.load(open(os.path.join(path, file), "r")), indent = 4))

이게 다른 사람에게 도움이 되길 바라.

하지 않습니다.json serializable은 serializable, json serializable은 serializable, json serializable은 serializable로 되어 있지 않습니다.사용자가 읽을 수 있도록 저장하려면 사전의 모든 비사전 요소에 대해 문자열을 반복적으로 호출해야 합니다.하려면 피클 후 " 파일").torch.save(obj, f)정상적으로 동작합니다).

이것이 나에게 효과가 있었다.

#%%

def _to_json_dict_with_strings(dictionary):
    """
    Convert dict to dict with leafs only being strings. So it recursively makes keys to strings
    if they are not dictionaries.

    Use case:
        - saving dictionary of tensors (convert the tensors to strins!)
        - saving arguments from script (e.g. argparse) for it to be pretty

    e.g.

    """
    if type(dictionary) != dict:
        return str(dictionary)
    d = {k: _to_json_dict_with_strings(v) for k, v in dictionary.items()}
    return d

def to_json(dic):
    import types
    import argparse

    if type(dic) is dict:
        dic = dict(dic)
    else:
        dic = dic.__dict__
    return _to_json_dict_with_strings(dic)

def save_to_json_pretty(dic, path, mode='w', indent=4, sort_keys=True):
    import json

    with open(path, mode) as f:
        json.dump(to_json(dic), f, indent=indent, sort_keys=sort_keys)

def my_pprint(dic):
    """

    @param dic:
    @return:

    Note: this is not the same as pprint.
    """
    import json

    # make all keys strings recursively with their naitve str function
    dic = to_json(dic)
    # pretty print
    pretty_dic = json.dumps(dic, indent=4, sort_keys=True)
    print(pretty_dic)
    # print(json.dumps(dic, indent=4, sort_keys=True))
    # return pretty_dic

import torch
# import json  # results in non serializabe errors for torch.Tensors
from pprint import pprint

dic = {'x': torch.randn(1, 3), 'rec': {'y': torch.randn(1, 3)}}

my_pprint(dic)
pprint(dic)

출력:

{
    "rec": {
        "y": "tensor([[-0.3137,  0.3138,  1.2894]])"
    },
    "x": "tensor([[-1.5909,  0.0516, -1.5445]])"
}
{'rec': {'y': tensor([[-0.3137,  0.3138,  1.2894]])},
 'x': tensor([[-1.5909,  0.0516, -1.5445]])}

왜 스트링을 반품하고 인쇄가 안 되는지 모르겠지만, 인쇄 명세서에 덤프를 직접 넣어야 할 것 같습니다.: ★pprint이미 제안되어 왔기 때문에.할 수 것은 .dict(dic)그래서 내 코드 중 일부가 이 조건을 체크하는 거야

콘텍스트:

pytorch 문자열을 저장하려고 했는데 계속 오류가 발생했습니다.

TypeError: tensor is not JSON serializable

그래서 코드화 했어요.주의: 네, 벽난로에서는torch.save피클 파일은 읽을 수 없어요관련 투고를 확인해 주세요.https://discuss.pytorch.org/t/typeerror-tensor-is-not-json-serializable/36065/3


PPrint는 또한 들여쓰기된 주장도 있지만, 나는 그것이 보이는 것이 마음에 들지 않았다.

    pprint(stats, indent=4, sort_dicts=True)

출력:

{   'cca': {   'all': {'avg': tensor(0.5132), 'std': tensor(0.1532)},
               'avg': tensor([0.5993, 0.5571, 0.4910, 0.4053]),
               'rep': {'avg': tensor(0.5491), 'std': tensor(0.0743)},
               'std': tensor([0.0316, 0.0368, 0.0910, 0.2490])},
    'cka': {   'all': {'avg': tensor(0.7885), 'std': tensor(0.3449)},
               'avg': tensor([1.0000, 0.9840, 0.9442, 0.2260]),
               'rep': {'avg': tensor(0.9761), 'std': tensor(0.0468)},
               'std': tensor([5.9043e-07, 2.9688e-02, 6.3634e-02, 2.1686e-01])},
    'cosine': {   'all': {'avg': tensor(0.5931), 'std': tensor(0.7158)},
                  'avg': tensor([ 0.9825,  0.9001,  0.7909, -0.3012]),
                  'rep': {'avg': tensor(0.8912), 'std': tensor(0.1571)},
                  'std': tensor([0.0371, 0.1232, 0.1976, 0.9536])},
    'nes': {   'all': {'avg': tensor(0.6771), 'std': tensor(0.2891)},
               'avg': tensor([0.9326, 0.8038, 0.6852, 0.2867]),
               'rep': {'avg': tensor(0.8072), 'std': tensor(0.1596)},
               'std': tensor([0.0695, 0.1266, 0.1578, 0.2339])},
    'nes_output': {   'all': {'avg': None, 'std': None},
                      'avg': tensor(0.2975),
                      'rep': {'avg': None, 'std': None},
                      'std': tensor(0.0945)},
    'query_loss': {   'all': {'avg': None, 'std': None},
                      'avg': tensor(12.3746),
                      'rep': {'avg': None, 'std': None},
                      'std': tensor(13.7910)}}

비교:

{
    "cca": {
        "all": {
            "avg": "tensor(0.5144)",
            "std": "tensor(0.1553)"
        },
        "avg": "tensor([0.6023, 0.5612, 0.4874, 0.4066])",
        "rep": {
            "avg": "tensor(0.5503)",
            "std": "tensor(0.0796)"
        },
        "std": "tensor([0.0285, 0.0367, 0.1004, 0.2493])"
    },
    "cka": {
        "all": {
            "avg": "tensor(0.7888)",
            "std": "tensor(0.3444)"
        },
        "avg": "tensor([1.0000, 0.9840, 0.9439, 0.2271])",
        "rep": {
            "avg": "tensor(0.9760)",
            "std": "tensor(0.0468)"
        },
        "std": "tensor([5.7627e-07, 2.9689e-02, 6.3541e-02, 2.1684e-01])"
    },
    "cosine": {
        "all": {
            "avg": "tensor(0.5945)",
            "std": "tensor(0.7146)"
        },
        "avg": "tensor([ 0.9825,  0.9001,  0.7907, -0.2953])",
        "rep": {
            "avg": "tensor(0.8911)",
            "std": "tensor(0.1571)"
        },
        "std": "tensor([0.0371, 0.1231, 0.1975, 0.9554])"
    },
    "nes": {
        "all": {
            "avg": "tensor(0.6773)",
            "std": "tensor(0.2886)"
        },
        "avg": "tensor([0.9326, 0.8037, 0.6849, 0.2881])",
        "rep": {
            "avg": "tensor(0.8070)",
            "std": "tensor(0.1595)"
        },
        "std": "tensor([0.0695, 0.1265, 0.1576, 0.2341])"
    },
    "nes_output": {
        "all": {
            "avg": "None",
            "std": "None"
        },
        "avg": "tensor(0.2976)",
        "rep": {
            "avg": "None",
            "std": "None"
        },
        "std": "tensor(0.0945)"
    },
    "query_loss": {
        "all": {
            "avg": "None",
            "std": "None"
        },
        "avg": "tensor(12.3616)",
        "rep": {
            "avg": "None",
            "std": "None"
        },
        "std": "tensor(13.7976)"
    }
}

json.syslog()는 json 데이터를 사전으로 변환합니다.그런 다음 dump()를 사용하여 들여쓰기 문자열로 변환합니다.

_json = '{"name":"John", "age":30, "car":null}'

data = json.loads(_json)

print (json.dumps(data, indent=2))

완벽과는 거리가 멀지만 효과가 있다.

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

개선이나 들여쓰기 등을 할 수 있지만, 보다 깨끗한 json을 읽고 싶다면, 이것이 좋은 방법입니다.

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

반응형