Pythonの改修をしている時に「渡ってきてるdictの要素なんだろうな」と思ってとりあえずprintしたら複雑な階層構造のdictがダーッと1行で出力されて非常に困ってしまったので、見やすく表示する方法を備忘として残しておく。
環境
$ python --version
Python 3.12.0
やり方(実行例)
Pythonを対話モードで起動して以下を実行すれば良い。
import json
# JSONに変換して出力したいdictをここに定義
target_dict = {'food': {'fruits': {'red_fruits': ['apple', 'strawberry', 'cherry'], 'yellow_fruits': ['banana', 'pineapple', 'lemon'], 'green_fruits': ['kiwi', 'grape', 'green apple']}, 'vegetables': {'leafy_greens': ['spinach', 'lettuce', 'kale'], 'root_vegetables': ['potato', 'carrot', 'radish'], 'nightshades': ['tomato', 'cucumber', 'bell pepper']}}, 'animals': {'mammals': {'carnivores': ['lion', 'tiger', 'bear'], 'rodents': ['squirrel', 'guinea pig', 'beaver'], 'ungulates': ['horse', 'cow', 'deer']}, 'birds': {'birds_of_prey': ['eagle', 'hawk', 'vulture'], 'waterfowl': ['duck', 'pelican', 'seagull'], 'songbirds': ['nightingale', 'mockingbird', 'canary']}, 'reptiles': {'snakes': ['anaconda', 'boa constrictor', 'cobra'], 'turtles': ['red-eared slider', 'box turtle', 'sea turtle'], 'lizards': ['iguana', 'gecko', 'chameleon']}}, 'space': {'constellations': {'northern_hemisphere': ['Ursa Major', 'Cassiopeia', 'Perseus'], 'southern_hemisphere': ['Centaurus', 'Phoenix', 'Southern Cross']}, 'planets': {'inner_planets': ['Mercury', 'Venus', 'Earth', 'Mars'], 'gas_giants': ['Jupiter', 'Saturn'], 'ice_giants': ['Uranus', 'Neptune'], 'dwarf_planets': ['Pluto', 'Eris']}, 'astronauts': {'NASA': ['Neil Armstrong', 'Buzz Aldrin', 'Sally Ride'], 'Roscosmos': ['Yuri Gagarin', 'Valentina Tereshkova'], 'ESA': ['Thomas Pesquet', 'Samantha Cristoforetti']}}}
# インデント4のJSONデータに変換
json_data = json.dumps(target_dict, indent=4)
print(json_data)
実行結果
階層構造がわからなかった1行の複雑なdictデータが非常にわかりやすく出力される。
{
"food": {
"fruits": {
"red_fruits": [
"apple",
"strawberry",
"cherry"
],
"yellow_fruits": [
"banana",
"pineapple",
"lemon"
],
"green_fruits": [
"kiwi",
"grape",
"green apple"
]
},
"vegetables": {
"leafy_greens": [
"spinach",
"lettuce",
"kale"
],
"root_vegetables": [
"potato",
"carrot",
"radish"
],
"nightshades": [
"tomato",
"cucumber",
"bell pepper"
]
}
},
"animals": {
"mammals": {
"carnivores": [
"lion",
"tiger",
"bear"
],
"rodents": [
"squirrel",
"guinea pig",
"beaver"
],
"ungulates": [
"horse",
"cow",
"deer"
]
},
"birds": {
"birds_of_prey": [
"eagle",
"hawk",
"vulture"
],
"waterfowl": [
"duck",
"pelican",
"seagull"
],
"songbirds": [
"nightingale",
"mockingbird",
"canary"
]
},
"reptiles": {
"snakes": [
"anaconda",
"boa constrictor",
"cobra"
],
"turtles": [
"red-eared slider",
"box turtle",
"sea turtle"
],
"lizards": [
"iguana",
"gecko",
"chameleon"
]
}
},
"space": {
"constellations": {
"northern_hemisphere": [
"Ursa Major",
"Cassiopeia",
"Perseus"
],
"southern_hemisphere": [
"Centaurus",
"Phoenix",
"Southern Cross"
]
},
"planets": {
"inner_planets": [
"Mercury",
"Venus",
"Earth",
"Mars"
],
"gas_giants": [
"Jupiter",
"Saturn"
],
"ice_giants": [
"Uranus",
"Neptune"
],
"dwarf_planets": [
"Pluto",
"Eris"
]
},
"astronauts": {
"NASA": [
"Neil Armstrong",
"Buzz Aldrin",
"Sally Ride"
],
"Roscosmos": [
"Yuri Gagarin",
"Valentina Tereshkova"
],
"ESA": [
"Thomas Pesquet",
"Samantha Cristoforetti"
]
}
}
}
似ているメソッドとしてjson.dump()
があるが、そちらはファイルとして保存する際に使用するもので、今回の辞書型を文字列に変換するjson.dumps()
とは異なるので注意。
余談
dictの出力形式を整えて表示するならpprint
モジュールが良いらしいが、今一つ使い方がわからなかった。
json
モジュールなら引数でインデント指定ができて簡単に見慣れたJSONデータに出力できるため今回使用モジュールとして選んだ次第。
余裕がある時にpprint
の使い方を調べて比較、追記します。
参考
json — JSON encoder and decoder - Python 3.12.0 documentation