etc./StackOverFlow

JSON 파일을 예쁘게 인쇄하는 방법은 무엇입니까?

청렴결백한 만능 재주꾼 2022. 3. 4. 07:55
반응형

질문자 :Colleen


나는 예쁘게 인쇄하고 싶은 엉망인 JSON 파일이 있습니다. 파이썬에서 이것을 하는 가장 쉬운 방법은 무엇입니까?

나는 PrettyPrint가 파일이 될 수 있다고 생각하는 "객체"를 취한다는 것을 알고 있지만 파일을 전달하는 방법을 모릅니다. 파일 이름을 사용하는 것만으로는 작동하지 않습니다.



json indent 할 공백 수를 지정하는 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)

Blender

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

 python3 -m json.tool some.json

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

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

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

 jq . some.json

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

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


Gismo Ranas

내장 모듈 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이 아닙니다.


ikreb

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

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

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

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

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

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

데모


Shubham Chaudhary

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)

zelusp

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

Nakamoto

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

 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

V P

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

David Liu

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

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


Pablo Emmanuel De Leo

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

산출

여기에 이미지 설명 입력


Travis Clarke

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

p3quod

빠르고 쉬운 로깅을 위해 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))

user 923227

이것이 다른 사람을 돕기를 바랍니다.

json을 직렬화할 수 없다는 오류가 있는 경우 위의 답변이 작동하지 않습니다. 사람이 읽을 수 있도록 저장하려면 사전의 모든 비 사전 요소에 대해 문자열을 재귀적으로 호출해야 합니다. 나중에 로드하려면 피클 파일로 저장한 다음 로드하십시오(예: 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 (eg argparse) for it to be pretty eg """ 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) 을 사용하여 dict로 변환될 수 있는 것은 아닙니다. 이것이 내 코드 중 일부가 이 조건에 대한 검사를 수행하는 이유입니다.

문맥:

pytorch 문자열을 저장하고 싶었지만 계속 오류가 발생했습니다.

 TypeError: tensor is not JSON serializable

그래서 위의 코드를 작성했습니다. 참고 예는, pytorch 당신이 사용하는 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)" } }

Charlie Parker

완벽하지는 않지만 작동합니다.

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

개선하고 들여쓰기 등을 추가할 수 있지만 더 깨끗한 json을 읽을 수 있기를 원한다면 이것이 갈 길입니다.


Francisco Perdomo

출처 : http:www.stackoverflow.com/questions/12943819/how-to-prettyprint-a-json-file

반응형