Python で JSON 書き込みをする

Python で JSON 書き込みをするPython
ゆうすけ
ゆうすけ

Python で JSON に書き込みしたいです。

資格マフィア
資格マフィア

Python で JSON に書き込む方法について解説しよう。

 

✔️ 本記事のテーマ

 Python に JSON に書き込む方法

 

✔️ 読者さんへの前置きメッセージ

本記事は
「Python プログラムで JSON を作成する方法」
について書いています。

 

json.dump を使って JSON に書き込む方法 や その際のオプションについて解説します。

 

この記事に掲載しているサンプルコードは環境さえ整っていれば、
コピペで動くはずなので使用して頂いてOKです。

 

では、解説していきましょう。

 

Python プログラムから JSON に書き込む

Python プログラムから JSON に書き込む

Python プログラムから JSON に書き込むには json.dump を使用します。

 

import json


sample_dict = {'A': 'apple', 'B': 'banana', 'C': 'carrot', 'D': 'drink', 'E': 'egg'}


with open('./sample.json', 'w') as f:
    json.dump(sample_dict, f)

json.dump には dict 型を渡すことで、キーと値の形式を保って JSON に書き込むことができます。

 

なお、ファイル IO になるので json.dump を with open 句で囲んで使います。

 

with open 句の引数に JSON ファイルのファイルパスを指定することで、
既存のファイルに書き込みを行うことができます。

 

Python プログラムから JSON を作成する

Python プログラムから JSON を作成する

json.dump を使う際に存在しない JOSN ファイルを指定することで
JSON ファイルを新規作成することができます。

 

新規作成されたファイルの中身は json.dump で渡す dict データになります。

$ cat ./new.json 
cat: ./new.json: No such file or directory

 

この状態で以下のコードを実行します。

import json


sample_dict = {'A': 'apple', 'B': 'banana', 'C': 'carrot', 'D': 'drink', 'E': 'egg'}


with open('./new.json', 'w') as f:
    json.dump(sample_dict, f)

 

すると、指定した内容の JSON ファイルが新規作成されます。

$ cat ./new.json 
{"A": "apple", "B": "banana", "C": "carrot", "D": "drink", "E": "egg"}

 

 

JSON に書き込みする際のオプション

JSON に書き込むときのオプション

Python から JSON に書き込みをする際に、
オプションを指定することで様々な書き込みが可能となります。

 

主なオプションは以下の通りです。

  • indent
  • ensure_ascii
  • separators
  • sort_keys

 

順番に解説していきましょう。
なお、上のリンクは記事内リンクになっています。

 

JSON 書き込みのオプション: indent

indent オプションを指定することで、要素ごとに改行、インデントした出力になります。

import json


sample_dict = {'A': 'apple', 'B': 'banana', 'C': 'carrot', 'D': 'drink', 'E': 'egg'}

with open('./sample.json', 'w') as f:
    json.dump(sample_dict, f, indent=4)

 

このコードを実行すると、以下のような JSON ファイルが出力されます。

{
    "A": "apple",
    "B": "banana",
    "C": "carrot",
    "D": "drink",
    "E": "egg"
}

 

要素ごとに改行されて、半角スペース4つインデントされてます。

 

このように、indent オプションをつけることで、見やすい JSON として出力することができます。

 

JSON 書き込みのオプション: ensure_ascii

ensure_ascii オプションを指定することで、
全角文字などの非ASCII文字をUnicodeエスケープせずに出力することができます。

 

そもそも json.dump() では日本語などの非ASCII文字を出力しようとすると、
Unicodeエスケープされて出力されます。

 

試しに、以下のように ‘卵’ という文字を json.dump() してみましょう。

import json


sample_dict = {'A': 'apple', 'B': 'banana', 'C': 'carrot', 'D': 'drink', 'E': '卵'}

with open('./sample.json', 'w') as f:
    json.dump(sample_dict, f)

 

このコードを実行すると、 sample.json の中身は以下のようになってしまいます。

{"A": "apple", "B": "banana", "C": "carrot", "D": "drink", "E": "\u5375"}

‘卵’ の文字が “\u5375” という表記にUnicodeエスケープされています。

 

そこで、 ensure_ascii=False とすると、Unicodeエスケープをせずに出力することができます。

import json


sample_dict = {'A': 'apple', 'B': 'banana', 'C': 'carrot', 'D': 'drink', 'E': '卵'}

with open('./sample.json', 'w') as f:
    json.dump(sample_dict, f, ensure_ascii=False)

 

これにより、日本語などの非ASCII文字をそのまま JSON 出力することができます。

{"A": "apple", "B": "banana", "C": "carrot", "D": "drink", "E": "卵"}

 

 

JSON 書き込みのオプション: separators

json.dump() では dict の key と value の間を : 、 要素の間を , で区切って出力されます。

 

separators オプションでそれぞれの区切り文字を指定することができます。

 

なお、separators オプションは以下のように 
(要素の区切り文字, keyとvalueの間) の tuple で指定します。

import json


sample_dict = {'A': 'apple', 'B': 'banana', 'C': 'carrot', 'D': 'drink', 'E': 'egg'}

with open('./sample.json', 'w') as f:
    json.dump(sample_dict, f, separators=('/', '_'))

 

このコードを実行すると、以下の JSON が出力されます。

{"A"_"apple"/"B"_"banana"/"C"_"carrot"/"D"_"drink"/"E"_"egg"}

要素の区切り文字が / で、key と value の間が _ で出力されています。

 

JSON 書き込みのオプション: sort_keys

sort_keys=True とすると、dict の key を基準にソートして出力します。

 

例えば、以下のように、要素の順番をバラバラにした sample_dict を 
sort_keys オプションをつけて json.dump() を通してみます。

import json


sample_dict = {'B': 'banana', 'C': 'carrot', 'A': 'apple', 'D': 'drink', 'E': 'egg'}

with open('./sample.json', 'w') as f:
    json.dump(sample_dict, f, sort_keys=True)

 

すると、以下のように、key順にソートされて出力されます。

{"A": "apple", "B": "banana", "C": "carrot", "D": "drink", "E": "egg"}

 

 

サードライブラリを使って JSON に書き込む

サードライブラリを使って JSON に書き込む

ここまで、Python の標準ライブラリで JSON に書き込みをする方法を解説してきました。

 

Python ではサードパーティライブラリを使って JSON に書き込みをすることもできます。

 

例えば、以下のように Marshmallow ライブラリを使って、
JSON の 読み込み / 書き込み をすることができます。

# MOdel 定義
class SampleModel(AllArgConstructorModel):
    def __init__(self, **kwargs):
        for k, v in kwargs.items():
            setattr(self, k, v)


# Schema 定義
class SampleModelSchema(Schema):
    id = fields.Int(required=True)
    name = fields.Str(required=True)

    @post_load
    def build(self, data, **kwargs):
        return SampleModel(**data)


# Schema インスタンスの作成
schema = SampleModelSchema()


# LOAD
smp = schema.load(smp)


# DUMP
schema.dumps(SampleModelSchema(name='Taro', age=20))

 

なお、Marshmallow を使った JSON の 読み込み / 書き込み については
「marshmallowの使い方【Pythonライブラリ】」
の記事で詳しく解説しています。

 

Python について独学でスキルを磨くための 1 冊

Python について独学でスキルを磨くための 1 冊

Pythonで JSON に書き込む方法について解説しました。

 

Pythonを基礎から学ぶためには以下の書籍がオススメです。

 

この書籍は初心者向けにかなり丁寧に書かれています。

プログラミング本は難しく、
とっつきにくい印象があるかもしれませんが、
この書籍はとても分かりやすく、
読んでいて「楽しい」と思えるような書きっぷりになっています。

 

初めてPythonを基礎から学ぶ方にはオススメの書籍です。

コメント

タイトルとURLをコピーしました