はじめに
Pythonのjson.loads()
で、ある.jsonを読み込み、読み込んだ直後のオブジェクトに対してjson.dumps()
を実行すると、実行後にファイルサイズが増加する現象に直面しました。
調査したところ、原因がjson.dumps()
を実行するときのsepatators
オプションにあり、デフォルト値だとファイルサイズが増加してしまうケースがあることが分かったため、対応方法を備忘録として残します。
separatorsオプション
separators
オプションはJSONのKey-Valueおよび要素間の区切り文字を指定するものですが、デフォルトだと(',', ': ')
が指定され、コロンの後ろに半角スペースが挿入されます。
separators はもし指定するなら (item_separator, key_separator) というタプルでなければなりません。デフォルトは indent が None のとき (', ', ': ') で、そうでなければ (',', ': ') です。最もコンパクトな JSON の表現を得たければ空白を削った (',', ':') を指定すればいいでしょう。
バージョン 3.4 で変更: indent が None でなければ (',', ': ') がデフォルトで使われます。
この仕様より、元々の.jsonで既に半角スペースが除かれているケースにおいては、出力時にjson.dumps()
をデフォルトオプションで実行することでファイルサイズが増加してしまうことになります。
separatorsオプションから空白を取り除く
上記で解説されているように、空白を削った(',', ':')
を明示的に指定することでファイルサイズを削減できます。
json.dumps(obj, separators=(',', ':'))
検証結果
条件(要素数など)によって変わりますが、手元のテストファイルで試した時には、separatorsオプションがデフォルト値の時のファイルサイズが71.4KBに対し、separatorsオプションを明示的に指定した時のファイルサイズが69.5KBとなり、1.9KB削減できました。
まとめ
1ファイルでは大したことありませんが、ETLなどの処理を実行する場合、数十万から数百万というファイル数になると、大きな差となって現れますので、このようなテクニックは頭の片隅に置いておくと良さそうです。