LoginSignup
190
130

More than 3 years have passed since last update.

[python] JSONファイルのフォーマットを整えてDumpする

Last updated at Posted at 2016-05-07

あまりにも単純なことなので、書くまでもないかと思ったけど、これから何回も使いそうなので、メモがてらjsonのダンプ方法をまとめておく。

例えば、こんな感じの辞書をjsonとしてdumpしようとした時、幾つかの問題に出くわした。

dict_sample = {'幽助': {'霊丸': {'ショットガン': 30, '霊光弾': 40}}, '桑原': '霊剣', 'Hiei': '邪王炎殺黒龍波', 'Kurama': 'ローズウィップ'}

f = open("output.json", "w")
json.dump(dict_sample, f)

上記のような日本語まじりの複雑な辞書をそのままdumpしてしまうと、出力は非常に見にくいものが出てくる。

output.json
{"Hiei": "\u90aa\u738b\u708e\u6bba\u9ed2\u9f8d\u6ce2", "Kurama": "\u30ed\u30fc\u30ba\u30a6\u30a3\u30c3\u30d7", "\u6851\u539f": "\u970a\u5263", "\u5e7d\u52a9": {"\u970a\u4e38": {"\u970a\u5149\u5f3e": 40, "\u30b7\u30e7\u30c3\u30c8\u30ac\u30f3": 30}}}

ワンライナーかよ!!asciiコードかよ!!

ということで、

jsonを綺麗に表示できるようにdumpする

単に、json.dumpメソッドに幾つかのオプションを加えてあげるだけでいい感じのフォーマットに整形してくれる。

dict_sample = {'幽助': {'霊丸': {'ショットガン': 30, '霊光弾': 40}}, '桑原': '霊剣', 'Hiei': '邪王炎殺黒龍波', 'Kurama': 'ローズウィップ'}

f = open("output.json", "w")
json.dump(dict_sample, f, ensure_ascii=False, indent=4, sort_keys=True, separators=(',', ': '))

ensure_ascii: False の場合、文字はそのまま出力されるとのこと
indent: 辞書のKeyやValueの階層を識別するためのインデント数
sort_keys: Keyでソートするか否か
separators:tuppleで1.KeyとValueを識別する区切り、2.要素を識別する区切りを指定できる

結果はこんな感じで帰ってくる

output.json
{
    "Hiei": "邪王炎殺黒龍波",
    "Kurama": "ローズウィップ",
    "幽助": {
        "霊丸": {
            "ショットガン": 30,
            "霊光弾": 40
        }
    },
    "桑原": "霊剣"
}

めっちゃ読みやすくなった。

参考
公式ドキュメント

190
130
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
190
130