Wie kann ich eine JSON-Datei in Python hübsch drucken?
Wie drucke ich eine JSON-Datei?
Colleen
Mixer
Das json
Modul implementiert bereits einige grundlegende hübsche Drucke in der dump
und dumps
Funktionen, mit der indent
Parameter, der angibt, um wie viele Leerzeichen eingerückt werden soll:
>>> 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
]
}
]
Verwenden Sie zum Analysieren einer Datei json.load()
:
with open('filename.txt', 'r') as handle:
parsed = json.load(handle)
-
Für einfaches Pretty-Printing funktioniert dies auch ohne explizites Parsing:
print json.dumps(your_json_string, indent=4)
– Peterino
4. August 2014 um 14:07 Uhr
-
Ohne den Einzug erhalten Sie nur eine einzelne Zeile mit hässlichem Text, weshalb ich hierher gekommen bin.
– krs013
16. März 2016 um 18:46 Uhr
-
Dies ähnelt JavaScript
var str = JSON.stringify(obj, null, 4);
wie hier diskutiert stackoverflow.com/questions/4810841/…– Christoph Roussy
31. Mai 2016 um 13:17 Uhr
-
@Peterino, es funktioniert nicht ohne explizites Parsen. Es gibt eine Escape-Zeile aus
– ACV
2. Juli 2021 um 16:24 Uhr
-
Im hübscheren JS-Tool wird kein “Zeilenumbruch” hinzugefügt, wenn die Linienbreite weniger als 80 beträgt. Ich suche danach.
– Peterlits Zo
22. Februar um 6:28 Uhr
Gismo Ranas
Sie können dies auf der Befehlszeile tun:
python3 -m json.tool some.json
(wie bereits in den Kommentaren zur Frage erwähnt, danke an @Kai Petzke für den python3-Vorschlag).
Eigentlich ist Python nicht mein Lieblingstool, was die JSON-Verarbeitung auf der Befehlszeile betrifft. Für einfaches, hübsches Drucken ist es in Ordnung, aber wenn Sie den Json manipulieren möchten, kann es zu kompliziert werden. Sie müssten bald eine separate Skript-Datei schreiben, Sie könnten am Ende Karten haben, deren Schlüssel u”some-key” (python unicode) sind, was die Auswahl von Feldern erschwert und nicht wirklich in die Richtung von hübsch geht -Drucken.
Sie können auch verwenden jq:
jq . some.json
und Sie erhalten Farben als Bonus (und eine viel einfachere Erweiterbarkeit).
Nachtrag: Es gibt einige Verwirrung in den Kommentaren über die Verwendung von jq zur Verarbeitung großer JSON-Dateien einerseits und die Verwendung eines sehr großen jq-Programms andererseits. Für den hübschen Druck einer Datei, die aus einer einzigen großen JSON-Entität besteht, ist die praktische Einschränkung der Arbeitsspeicher. Für das Pretty-Printing einer 2-GB-Datei, die aus einem einzelnen Array von realen Daten besteht, betrug die für das Pretty-Printing erforderliche “maximale residente Satzgröße” 5 GB (unabhängig davon, ob jq 1.5 oder 1.6 verwendet wird). Beachten Sie auch, dass jq danach innerhalb von Python verwendet werden kann pip install jq
.
-
JQ ist großartig, aber es gibt eine maximale Grenze, daher ist es für große Dateien nutzlos. (dh explodiert beim Umgang mit einer 1,15-MB-Datei) github.com/stedolan/jq/issues/1041
– Chris McKee
17. Mai 2016 um 8:35 Uhr
-
Ja, Mann, auf jeden Fall, wenn Sie jq-Filter mit mehr als 10.000 Codezeilen schreiben, versuchen Sie, glaube ich, so etwas wie mit einem Fahrrad zum Mars zu fahren.
– Gismo Ranas
17. Mai 2016 um 8:39 Uhr
-
lol 😀 @gismo-ranas Die json.tool-Version, die an eine Datei geleitet wird, funktioniert bei großen Dateien wirklich sehr gut. und ist verdammt schnell. Ich mag JQ, aber das Formatieren von allem, was über eine kleine Nutzlast hinausgeht (was Sie in den meisten Texteditoren tun könnten), ist außerhalb seiner Reichweite 🙂 Zufällige Ergänzung: json-generator.com ist ein nettes Werkzeug, um Testdaten zu machen
– Chris McKee
17. Mai 2016 um 8:46 Uhr
-
oder nur:
jq '' < some.json
– fataler Fehler
9. Dezember 2016 um 19:21 Uhr
-
Eigentlich empfehle ich dringend die Verwendung
python3 -m json.tool <IN >OUT
, da dies die ursprüngliche Reihenfolge der Felder in JSON-Dikten beibehält. Der Python-Interpreter Version 2 sortiert die Felder alphabetisch aufsteigend, was oft nicht erwünscht ist.– Kai Petzke
20. Januar 2019 um 17:00 Uhr
ikreb
Sie könnten das eingebaute Modul verwenden pprint (https://docs.python.org/3.9/library/pprint.html).
Wie Sie die Datei mit json-Daten lesen und ausdrucken können.
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'}
Die Ausgabe ist kein gültiger JSON, da pprint einfache Anführungszeichen verwendet und die JSON-Spezifikation doppelte Anführungszeichen erfordert.
Wenn Sie den hübsch gedruckten json in eine Datei umschreiben möchten, müssen Sie verwenden pprint.pformat.
pretty_print_json = pprint.pformat(json_data).replace("'", '"')
with open('file_name.json', 'w') as f:
f.write(pretty_print_json)
-
Das Problem dabei ist, dass pprint einfache und doppelte Anführungszeichen austauschbar verwendet, json jedoch nur doppelte Anführungszeichen benötigt, sodass Ihr pprinted json möglicherweise nicht mehr als gültiger json analysiert wird.
– Dreviko
29. Juni 2018 um 14:38 Uhr
-
Ja, aber nur um eine JSON-Datei auszugeben. Nicht die Ausgabe zu nehmen und wieder in eine Datei zu schreiben.
– ikreb
9. Juli 2018 um 14:01 Uhr
-
Die Frage besagt ausdrücklich, dass eine JSON-Datei hübsch gedruckt werden soll, keine Python-Darstellung einer JSON-Datei
– Daniel Farell
10. November 2021 um 16:37 Uhr
-
@DanielFarrell Du hast Recht. Vielen Dank. Ich habe meine Antwort aktualisiert.
– ikreb
24. November 2021 um 14:37 Uhr
Shubham Chaudhary
Pygmentize + Python json.tool = Schöner Druck mit Syntaxhervorhebung
Pygmentize ist ein Killer-Tool. Sieh dir das an.
Ich kombiniere python json.tool mit pygmentize
echo '{"foo": "bar"}' | python -m json.tool | pygmentize -l json
Unter dem obigen Link finden Sie eine Installationsanleitung für die Pygmentisierung.
Eine Demo davon ist im Bild unten:
zelusp
Verwenden Sie diese Funktion und müssen Sie sich nicht daran erinnern, ob Ihr JSON eine ist str
oder dict
nochmal – schau dir nur den hübschen Aufdruck an:
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)
Oliver
Verwenden Sie pprint: https://docs.python.org/3.6/library/pprint.html
import pprint
pprint.pprint(json)
print()
verglichen mit 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'}
VP
Um von der Befehlszeile aus hübsch drucken zu können und die Kontrolle über den Einzug usw. zu haben, können Sie einen ähnlichen Alias wie diesen einrichten:
alias jsonpp="python -c 'import sys, json; print json.dumps(json.load(sys.stdin), sort_keys=True, indent=2)'"
Und dann verwenden Sie den Alias auf eine der folgenden Arten:
cat myfile.json | jsonpp
jsonpp < myfile.json
Versuchen Sie, den JSON mit zu analysieren
json.loads()
und drucken Sie das resultierende Wörterbuch hübsch aus. Oder springen Sie einfach zu den Hübscher Druck Abschnitt der Python Dokumentation fürjson
.– Mixer
17. Oktober 2012 um 21:40 Uhr
stackoverflow.com/questions/352098/…
– Hrsg.
17. Oktober 2012 um 21:42 Uhr
@Blender, wenn Sie eine Antwort posten, gebe ich Ihnen Anerkennung … dies wird möglicherweise als Duplikat geschlossen, da die Lösung dieselbe ist, aber die Frage anders ist, also vielleicht nicht.
– Kolleen
17. Oktober 2012 um 21:50 Uhr
warum nicht
<your_file.js python -mjson.tool
wie in @eds Link?– jfs
17. Oktober 2012 um 21:56 Uhr
Ich glaube nicht, dass es doppelt ist, weil das hübsche Drucken von der Befehlszeile aus nicht dasselbe ist wie das hübsche Drucken programmgesteuert von Python. Abstimmung zur Wiedereröffnung.
– vitaut
16. September 2015 um 15:31 Uhr