JSON फ़ाइल को प्रीप्रेटप्रिंट कैसे करें?


1056

मेरे पास एक JSON फ़ाइल है जो एक गड़बड़ी है जिसे मैं पूर्व-निर्धारित करना चाहता हूं - अजगर में ऐसा करने का सबसे आसान तरीका क्या है? मुझे पता है कि प्रिटीप्रिंट एक "ऑब्जेक्ट" लेता है, जो मुझे लगता है कि एक फ़ाइल हो सकती है, लेकिन मुझे नहीं पता कि फ़ाइल को कैसे पास किया जाए - सिर्फ फ़ाइल नाम का उपयोग करने से काम नहीं चलता है।


9
JSON का उपयोग कर पार्स करने की कोशिश करें json.loads()और इसके परिणामस्वरूप सुंदर प्रिंट करें। या सिर्फ पायथन प्रलेखन के सुंदर मुद्रण अनुभाग के लिए छोड़ें । json
ब्लेंडर


1
@ ब्लेंडर यदि आप उत्तर देते हैं तो मैं आपको क्रेडिट दूंगा ... यह डुप्लिकेट के रूप में बंद हो सकता है, क्योंकि समाधान एक ही है, लेकिन सवाल अलग है, इसलिए शायद नहीं।
कोलीन

18
<your_file.js python -mjson.tool@ एड लिंक में क्यों नहीं ?
jfs

11
मुझे नहीं लगता कि यह डुप्लिकेट है क्योंकि कमांड लाइन से सुंदर-प्रिंटिंग, पायथन से प्रोग्राम-प्रिंटिंग के समान नहीं है। फिर से मतदान करना।
विटाट

जवाबों:


1655

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)
पीटरिनो

1
इंडेंट क्या करता है?
टाइमब्रम

8
@timbram: यह इंडेंट द्वारा रिक्त स्थान की संख्या है।
ब्लेंडर

9
इंडेंट के बिना, आपको बस बदसूरत पाठ की एक पंक्ति मिलती है, यही वजह है कि मैं यहां आया था।
krs013

5
@Peterino मुझे पहले json string पार्स करना था: print(json.dumps(json.loads(your_json_string), indent=2))अन्यथा यह मुझे एक
बची हुई

310

आप इसे कमांड लाइन पर कर सकते हैं:

python3 -m json.tool some.json

(जैसा कि पहले ही टिप्पणी में उल्लेख किया गया है, python3 सुझाव के लिए @Kai Petzke के लिए धन्यवाद)।

वास्तव में अजगर मेरा पसंदीदा उपकरण नहीं है क्योंकि जहाँ तक कमांड लाइन पर जोंस प्रसंस्करण का सवाल है। सरल सुंदर मुद्रण के लिए ठीक है, लेकिन अगर आप जसन को हेरफेर करना चाहते हैं तो यह अतिरंजित हो सकता है। आपको जल्द ही एक अलग स्क्रिप्ट-फ़ाइल लिखने की आवश्यकता होगी, आप उन मानचित्रों के साथ समाप्त हो सकते हैं जिनकी कुंजी u "कुछ-की" (अजगर यूनिकोड) है, जो फ़ील्ड्स का चयन करना अधिक कठिन बनाता है और वास्तव में सुंदर की दिशा में नहीं जाता है -मुद्रण।

आप jq का उपयोग भी कर सकते हैं :

jq . some.json

और आपको बोनस के रूप में रंग मिलते हैं (और आसान सुगमता)।

परिशिष्ट: एक तरफ बड़ी JSON फ़ाइलों को संसाधित करने के लिए jq का उपयोग करने के बारे में टिप्पणियों में कुछ भ्रम है, और दूसरी तरफ एक बहुत बड़ा jq कार्यक्रम है। एक बड़ी JSON इकाई से युक्त फ़ाइल को सुंदर-छपाई के लिए, व्यावहारिक सीमा RAM है। सुंदर-मुद्रण के लिए वास्तविक दुनिया डेटा के एकल सरणी से युक्त 2GB फ़ाइल, सुंदर-मुद्रण के लिए आवश्यक "अधिकतम निवासी सेट आकार" 5GB था (चाहे jq 1.5 या 1.6 का उपयोग कर)। यह भी ध्यान दें कि बाद में अजगर के भीतर से jq का उपयोग किया जा सकता है pip install jq


4
JQ महान है लेकिन बड़ी फ़ाइलों के लिए बेकार है इसलिए अधिकतम सीमा है। (यानी एक 1.15mb फ़ाइल को संभालने के लिए ऊपर उड़ता है) github.com/stedolan/jq/issues/1041
क्रिस मैककी

3
हाँ, यार, निश्चित रूप से, यदि आप कोड के 10K से अधिक लाइनों के साथ jq फ़िल्टर लिख रहे हैं, तो मुझे लगता है कि आप साइकिल के साथ मंगल पर जाने की कोशिश कर रहे हैं।
जिस्मो राणा

2
lol: D @ gismo-ranas json.tool संस्करण एक फ़ाइल के लिए पाइप वास्तव में बड़ी फ़ाइलों पर वास्तव में अच्छी तरह से काम करता है; और मूर्खतापूर्ण उपवास है। मुझे JQ पसंद है लेकिन एक छोटे से पेलोड (जो आप ज्यादातर टेक्स्ट एडिटर्स में कर सकते हैं) से परे कुछ भी फॉर्मेट करना इसकी पहुंच से परे है :) यादृच्छिक जोड़: json-generator.com टेस्ट डेटा बनाने के लिए एक साफ-सुथरा टूल है
क्रिस मैककी

5
या बस:jq '' < some.json
fatal_error

2
वास्तव में मैं दृढ़ता से उपयोग करने की सलाह देता हूं python3 -m json.tool <IN >OUT, क्योंकि यह खेतों के मूल क्रम को JSON में रखता है। अजगर दुभाषिया संस्करण 2 खेतों को वर्णानुक्रम में आरोही क्रम में क्रमबद्ध करता है, जो अक्सर नहीं होता है, जो आप चाहते हैं।
काई पेट्ज़के

55

आप बिल्ट-इन modul 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 को केवल दोहरे उद्धरण चिह्नों की आवश्यकता होती है, इसलिए आपका प्रिंट किया गया json अब मान्य json के रूप में पार्स नहीं हो सकता है।
ड्रेविको

1
हाँ, लेकिन यह केवल एक json फ़ाइल का उत्पादन करने के लिए है। आउटपुट लेने के लिए नहीं और इसे एक फ़ाइल में फिर से लिखें।
ikreb

52

पायलेटाइज + पायथन json.tool = सिंटैक्स हाइलाइटिंग के साथ सुंदर प्रिंट

पाइगेटाइज एक हत्यारा उपकरण है। यह देखो।

मैं पायथन के साथ अजगर json.tool को जोड़ती हूं

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

स्थापना निर्देश pyactize के लिए ऊपर दिए गए लिंक को देखें।

इसका एक चित्र नीचे दी गई छवि में है:

डेमो


1
आपके उदाहरण -gमें वास्तव में काम नहीं कर रहा है;) चूंकि स्टड से इनपुट आता है, इसलिए पाइगेटाइज एक अच्छा अनुमान लगाने में सक्षम नहीं है। आपको स्पष्ट रूप से लेक्सर निर्दिष्ट करने की आवश्यकता है:echo '{"foo": "bar"}' | python -m json.tool | pygmentize -l json
डेनिस द मेनेस

1
@DenisTheMenace यह 2015 में काम करता था जब मैंने इस उदाहरण की छवि बनाई थी। यह मेरे सिस्टम पर भी अब काम नहीं कर रहा है।
शुभम चौधरी

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 है। यह 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: मैंने कोड को एक अलग रेपो में रखा , कुछ बग्स को ठीक किया और कुछ अन्य ट्विक्स किए।


मैं इस सूत्रकार को सुझाए गए लोगों से सर्वश्रेष्ठ मानता हूं, और अधिक उत्थान के हकदार हैं।
थोरहंटर

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 दस्तावेज़ का उत्पादन नहीं करता है।
11:26 पर सेल्वु नो

5

यहाँ पाइथन में एक अच्छे तरीके से कंसोल को सुंदर छपाई JSON का एक सरल उदाहरण है, बिना 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


1

मुझे लगता है कि त्रुटियों से बचने के लिए इससे पहले कि जोंस को पार्स करना बेहतर है:

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

आप पदचिह्न की कोशिश कर सकते हैं ।


स्थापना

$ pip3 install pprintjson

प्रयोग

बहुत अच्छा प्रिंट JSON फ़ाइल से एक प्रिंटप्रिंट सीएलआई का उपयोग कर।

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

बहुत अच्छा प्रिंट JSON एक स्टड से pprintjson CLI का उपयोग कर।

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

प्रिन्जसन CLI का उपयोग करके स्ट्रिंग से बहुत सुंदर JSON प्रिंट करें।

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

1 के इंडेंट के साथ स्ट्रिंग से बहुत सुंदर JSON प्रिंट करें।

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

एक स्ट्रिंग से सुंदर JSON प्रिंट करें और आउटपुट को फ़ाइल आउटपुट में सहेजें। json।

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

उत्पादन

यहां छवि विवरण दर्ज करें


0

यह एकदम सही है, लेकिन यह काम करता है।

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

आप इसमें सुधार कर सकते हैं, इंडेंटिंग वगैरह जोड़ सकते हैं, लेकिन अगर आप बस एक क्लीनर जसन को पढ़ने में सक्षम होना चाहते हैं, तो यह रास्ता तय करना है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.