ソースに絡まるエスカルゴ

貧弱プログラマの外部記憶装置です。

【python】jsonファイルの扱いについて

 pythonを使っていてjsonファイルを扱いたくなる時があります。

 扱うのは簡単なのですが、文字コードあたりと絡むと面倒だったり似たような名前の関数でどっちがどっちだっけ、みたいになって自分も混乱していたので記事にしようと思った次第です。

 今回はそのjsonファイルを扱う方法についての備忘録です。

 では、始めます。


1:jsonファイルを扱う関数について
 基本的には以下の4つの関数を使うだけです。

import json

json.load()  # jsonファイルを辞書に変換
json.dump()  # 辞書をjsonファイルに保存

json.loads() # json文字列を辞書に変換
json.dumps() # 辞書をjson文字列に変換

 具体的には以下のように使います。

json.load

# ファイルが存在していればjsonファイル読み込み
if os.path.exists(json_path):
    # windowsの場合は「encoding="utf-8_sig"」にする
    with open(json_path, "r", encoding="utf-8") as f:
        data = json.load(f) # jsonを辞書として読み込み

json.dump

# utf-8で書き込み
with open(save_path, 'w', encoding='utf-8') as f:
    # インデントをつけてアスキー文字列ではない形で保存
    json.dump(data, f, indent=4, ensure_ascii=False)

json.loads

# json文字列(str)を辞書に変換する関数
data = json.loads(data)

json.dumps

# 辞書をjson文字列に変換
data = json.dumps(data, indent=4, ensure_ascii=False)

 詳しい変換の方法は以下のページ様が詳しいので気になる方は参照してください。

 sがついてある方がjson文字列としての操作、sがついてない方がファイル操作の関数という風に覚えるといいかもしれません。

 これらは自分はごっちゃになってしまったので、それぞれの使い方の例を挙げていきます。


2:jsonファイルを扱うサンプル
 サンプルとして2つのファイルをコピペして同じ階層にutf-8の形式で保存して実行します。

json_test.json

# coding: utf-8
import os
import json


# 型と中身を表示させる関数
def print_data(data):
    print(type(data))
    print(data)


def main():
    json_path = "./test.json" # jsonファイルパス
    save_path = "./save.json" # 保存ファイルパス

    data = None

    # ファイルが存在していればjsonファイル読み込み
    if os.path.exists(json_path):
        # windowsの場合は「encoding="utf-8_sig"」にする
        with open(json_path, "r", encoding="utf-8") as f:
            data = json.load(f) # jsonを辞書として読み込み
    print_data(data) # 内容確認

    # 中身を一部書き換え
    test1_data = data['test1']
    test1_data['number'] = 3
    test1_data['text'] = "書き換え"

    # 辞書をjson文字列に変換
    data = json.dumps(data, indent=4, ensure_ascii=False)
    print_data(data) # 内容確認

    # json文字列(str)を辞書に変換する関数
    data = json.loads(data)
    print_data(data) # 内容確認

    # utf-8で書き込み
    with open(save_path, 'w', encoding='utf-8') as f:
        # インデントをつけてアスキー文字列ではない形で保存
        json.dump(data, f, indent=4, ensure_ascii=False)


if __name__ == '__main__':
    main()

・test.json

{
    "test1"  : {"number" : 1, "text": "てすと1"},
    "test2"  : {"number" : 2, "text": "てすと2"}
 }

 実際に実行すると以下のような結果になります。

$ python json_test.py
<class 'dict'>
{'test1': {'number': 1, 'text': 'てすと1'}, 'test2': {'number': 2, 'text': 'てすと2'}}
<class 'str'>
{
    "test1": {
        "number": 3,
        "text": "書き換え"
    },
    "test2": {
        "number": 2,
        "text": "てすと2"
    }
}
<class 'dict'>
{'test1': {'number': 3, 'text': '書き換え'}, 'test2': {'number': 2, 'text': 'てすと2'}}

 新規作成された「save.json」ファイルを開くと、ちゃんと書き換えられた内容で保存されていることも確認できます。

・save.json

{
    "test1": {
        "number": 3,
        "text": "書き換え"
    },
    "test2": {
        "number": 2,
        "text": "てすと2"
    }
}


 以上がpythonにおけるjsonファイルの扱い方です。

 文字コードが絡んで一気に面倒になってしまった経験があるので、同じように困っている人のお役に立てば幸いです。


・参考資料