乱雑なJSONファイルをプリティプリントしたい-Pythonでこれを行う最も簡単な方法は何ですか?PrettyPrintは「オブジェクト」を取得することを知っていますが、これはファイルである可能性がありますが、ファイルを渡す方法がわかりません。ファイル名を使用するだけでは機能しません。
<your_file.js python -mjson.tool
@edのリンクのようにしないのはなぜですか?
乱雑なJSONファイルをプリティプリントしたい-Pythonでこれを行う最も簡単な方法は何ですか?PrettyPrintは「オブジェクト」を取得することを知っていますが、これはファイルである可能性がありますが、ファイルを渡す方法がわかりません。ファイル名を使用するだけでは機能しません。
<your_file.js python -mjson.tool
@edのリンクのようにしないのはなぜですか?
回答:
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)
print json.dumps(your_json_string, indent=4)
print(json.dumps(json.loads(your_json_string), indent=2))
それ以外の場合、エスケープされた文字列が表示されました
コマンドラインでこれを行うことができます:
python3 -m json.tool some.json
(質問の解説ですでに述べたように、python3の提案を@Kai Petzkeに感謝します)。
コマンドラインでのjson処理に関する限り、実際にはpythonは私のお気に入りのツールではありません。単純なプリティプリントの場合は問題ありませんが、jsonを操作する場合は、非常に複雑になる可能性があります。すぐに別のスクリプトファイルを記述する必要があります。結局、キーがu "some-key"(python unicode)であるマップになる可能性があります。これにより、フィールドの選択がより困難になり、実際にはかなりの方向に進みません。 -印刷。
jq . some.json
おまけとして色が付きます(拡張性が向上します)。
補遺:一方ではjqを使用して大きなJSONファイルを処理し、他方では非常に大きなjqプログラムを使用することについてのコメントに混乱があります。単一の大きなJSONエンティティで構成されるファイルをプリティプリントする場合、実用的な制限はRAMです。実世界のデータの単一配列で構成される2GBファイルをプリティプリントする場合、プリティプリントに必要な「最大常駐セットサイズ」は5GBでした(jq 1.5または1.6のどちらを使用していても)。また、jqはpython内から使用できることにも注意してくださいpip install jq
。
jq '' < some.json
python3 -m json.tool <IN >OUT
ます。これにより、JSON辞書のフィールドの元の順序が維持されます。Pythonインタプリタバージョン2では、フィールドがアルファベット順に昇順で並べ替えられます。
組み込みの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)
Pygmentizeはキラーツールです。これを見てください。
私はpython json.toolをpygmentizeと組み合わせます
echo '{"foo": "bar"}' | python -m json.tool | pygmentize -l json
pygmentizeのインストール手順については、上記のリンクを参照してください。
これのデモは下の画像にあります:
-g
では実際には機能していません;)入力はstdinから来ているので、pygmentizeは良い推測をすることができません。あなたが明示的にレクサーを指定する必要がありますecho '{"foo": "bar"}' | python -m json.tool | pygmentize -l json
この関数を使用すれば、JSONが1 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)
prettyjson()
見栄えのする出力を生成する関数を書いたことがあります。このリポジトリから実装を取得できます。
この関数の主な機能は、特定の値maxlinelength
に達するまで、dictおよびリスト項目を1行で保持しようとすることです。これにより、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:コードを別のリポジトリに配置し、いくつかのバグを修正し、他のいくつかの調整を行いました。
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ドキュメントを生成しません。
以下は、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))
def saveJson(date,fileToSave):
with open(fileToSave, 'w+') as fileToSave:
json.dump(date, fileToSave, ensure_ascii=True, indent=4, sort_keys=True)
それを表示するか、ファイルに保存します。
あなたはpprintjsonを試すことができます。
$ pip3 install pprintjson
pprintjson CLIを使用して、ファイルからJSONをきれいに出力します。
$ pprintjson "./path/to/file.json"
pprintjson CLIを使用して、標準入力から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
それは完璧には程遠いですが、それは仕事をします。
data = data.replace(',"',',\n"')
あなたはそれを改善したり、インデントを追加したりすることができますが、よりきれいなjsonを読むことができるようにしたいだけなら、これは行く方法です。
json.loads()
してJSONを解析し、結果の辞書をきれいに出力してください。または、Python ドキュメントの「Pretty Printing」セクションにスキップしてください。json