🐍

【Python】Pythonでjsonを扱いたい!

2022/03/28に公開

pythonを使ってjsonファイルの中身を修正したいなーと思ったので
Pythonでのjsonファイルの使い方を勉強した内容です。

jsonの中身

今回用意したjsonの中身は以下のような感じです。

{
    "data1" : {
        "elements1" : "data1 elements1",
        "elements2" : "data1 elements2"
    },
    "data2" : {
        "elements1" : "data2 elements1",
        "elements2": {
            "element1" : "data2 elements2 element1",
            "element2" : "data2 elements2 element2",
            "element3" : "data2 elements2 element3"
        }
    }
}

jsonのインポート

まず以下のライブラリをimportしておきます。
jsonライブラリはpip installする必要はありません。

import json

jsonファイルを開く

次にopenjson.load()使用してjsonファイルを開きます。
この時openでは読み取り専用モードで開いておきましょう。

def main():

    json_file = open('data.json', 'r')
    json_data = json.load(json_file)

if __name__ == '__main__':
    main()

こうすることでjsonファイルがdict型で読み込まれます。
後はこれを読み取っていくだけです。

jsonから取得したdictを読み取っていく

用意したjsonのdictデータを
forで取得していく場合は各要素のdictが返ってくるわけではなく、
一番上の要素data1data2str型で返ってきます。
そのためdictで取得するコードを書いておく必要があります。

指定した要素の要素をdict取得したい場合は
data1['elements']のように書くことで取得できます。

def main():

    json_file = open('data.json', 'r')
    json_data = json.load(json_file)

    for datas in json_data:
        # datasにはstrが入っているためdictで取得する
        data = json_data[datas]


if __name__ == '__main__':
    main()

jsonファイルを書き換えていく

dict型で読み込んでいるので
まんま要素を指定して書き換えたいように書き換えるだけです。

def main():

    json_file = open('data.json', 'r')
    json_data = json.load(json_file)

    for datas in json_data:
        data = json_data[datas]
        data['elements2'] = 'new data elements'


if __name__ == '__main__':
    main()

jsonファイルのdata1の要素elements2のように中にデータが1個だけ入ってる、
いわゆる中身がstr型であれば
data1['elements2'] = 'new data elements'のように書くことで
書き換えができます。

ただ問題はdata2elements2の部分です。
この部分は上記のように指定すると
中身はdict型になっており型が合わないため
エラーが発生し要素の書き換えができません。

そのため要素がstr型なのかdict型なのかを確認して
その結果で処理を分けておく必要があります。

def main():

    json_file = open('data.json', 'r')
    json_data = json.load(json_file)

    for datas in json_data:
        data = json_data[datas]
        elements = data['elements2']
        
        if isinstance(elements, str):
            elements['elements2'] = 'new data elements'

        if isinstance(elements, dict):
            element = elements['elements2']
            element['element2'] = 'new data elements element'


if __name__ == '__main__':
    main()

jsonファイルの保存

現在書き換えているのは
読み込んだjsonファイルをdict型の変数に入れて
そこを編集しているだけなので
一通り書き換えが完了したらjson形式で保存します。

保存方法としては
読み込んだファイルとは別のファイルを開き
そこに書き込む形です。
jsonファイルへの書き出しは
json.dumpを使用します。

引数は以下のように指定します。

json.dump([書き出し元dict], [書き出し先ファイル])

また、
このまま書き出すとインデントされていない
jsonファイルが出来上がるので、
インデントされたものが欲しい場合は
以下のように記入します。

json.dump([書き出し元dict], [書き出し先ファイル], indent=[インデント])
def main():

    json_file = open('data.json', 'r')
    json_data = json.load(json_file)

    for datas in json_data:
        data = json_data[datas]
        elements = data['elements2']
        
        if isinstance(elements, str):
            elements['elements2'] = 'new data elements'

        if isinstance(elements, dict):
            element = elements['elements2']
            element['element2'] = 'new data elements element'

    # jsonファイルの書き出し
    output_json = open('output.json', 'w')
    json.dump(json_data, output_json, indent=4)


if __name__ == '__main__':
    main()

要素へのアクセス方法は少しややこしいですが
慣れれば何とか……。

Discussion