JSONファイルを持っていますが、それを印刷したいのですが、Pythonでこれを行う最も簡単な方法は何ですか? PrettyPrintが「オブジェクト」を取ることを私は知っています、それは私がファイルであることができると思います、しかし、私はファイルを渡す方法を知りません - ただファイル名を使うことはうまくいきません。
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)
これはコマンドラインで実行できます。
python3 -m json.tool < some.json
(すでに質問の解説で述べたように、python3の提案をくれた@Kai Petzkeに感謝します)。
コマンドラインでのJSON処理に関しては、Pythonは私のお気に入りのツールではありません。単純な場合はきれいな印刷でも問題ありませんが、jsonを操作したいのであれば、過度に複雑になる可能性があります。もうすぐ別のスクリプトファイルを書く必要があるでしょう。キーが "some-key"(python unicode)であるマップになってしまうかもしれません。 -印刷。
jq を使用します。上記のことを行うことができます:
jq '' < some.json
そして、あなたは色をボーナスとして手に入れます(そして、もっと簡単に拡張性が得られます)。
Pygmentizeはキラーツールです。 これを見なさい。
私はpython json.toolとpygmentizeを組み合わせています
echo '{"foo": "bar"}' | python -m json.tool | pygmentize -l json
Pygmentizeのインストール手順については上記のリンクを参照してください。
このデモは以下の図にあります。
組み込みモジュール pprint を使うことができます。
どのようにあなたはJSONデータでファイルを読み、それを印刷することができます。
import json
import pprint
with open('filename.txt', 'r') as f:
data = f.read()
json_data = json.loads(data)
pprint.pprint(json_data)
この関数を使って、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)
コマンドラインから見栄えよく印刷してインデントなどを制御できるようにするには、次のようなエイリアスを設定します。
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
これは、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))
エラーを避けるために、以前に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)
Pprintを使う: https://docs.python.org/3.6/library/pprint.html
import pprint
pprint.print(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'}
私はかつて見栄えの良い出力を生成するためにprettyjson()
関数を書きました。実装は このリポジトリ から取得できます。
この関数の主な特徴は、特定のmaxlinelength
に達するまで1行にdictとlistの項目を保持しようとすることです。これにより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]]
}
}