Python

Pythonを使ったJSONファイルを操作!読み込みから書き込みまでの基本操作を解説

2021年9月12日

PythonによるJSONファイルの操作

Pythonを使ったJSONの操作ついて解説します。

この記事では、Python標準のjsonモジュールとGeoJSONについて説明しています。

simplejsonについてはPython標準のモジュールと使い方は同じなので、興味がある方はこの記事にあるPython標準のjsonの使い方をご確認ください。

他にもPythonでいろいろなファイルの読み書きを解説しています。

ご興味があれば、下記の記事もご覧ください。

Pythonファイル操作
Pythonでいろんな種類のファイルを操作方法を解説
Pythonを使って、テキストやJSON、YAMLといったさまざまなファイルの読み書きに関してピックアップしてみました。 調べてみてわかったことは、ほとんどのモジュールが書き込みと読み込みで同じような書き方になっていました。 そのため、数種 ...

続きを見る

JSONとは

JSONとは

JSONとは、JavaScript Object Notationの略で、テキストベースのデータ形式の一つです。

類似するデータ形式として、YAMLがあります。

このJSONですが、名前の通りJavaScriptと相性が良くデータの送受信に利用されてきました。

しかし現在は、PythonやJava、PHPといった他言語でも幅広く利用されています。

JSONファイルの書き方

JSONファイルの書き方

JSON形式はXMLと違って、かなり各ボリュームが減ります。

XMLでアカウント一覧を作成すると下記のようになったとします。

<?xml version="1.0" encoding="UTF-8" ?>
<accounts>
    <member>
        <name>太郎</name>
        <age>20</age>
    </member>
    <member>
        <name>次郎</name>
        <age>19</age>
    </member>
</accounts>

これをJSONにすると下記のようになります。

{
  "accounts": [
    {
      "name": "太郎",
      "age": 20
    },
    {
      "name": "次郎",
      "age": 19
    }
  ]
}

XMLよりはごちゃごちゃした感じがなく、スッキリしていませんか?

そのため、私はJSON形式ばっかり使っています。

値の書き方

Pythonの辞書型を使っているとわかると思いますが、下記のようにキーと値を使って書きます。

{"キー": 値}

JSONの場合はキーや文字列の値に対して、ダブルクォーテーションで囲まないといけません。

プログラムによってシングルクォーテーションの値で動く場合もありますが、JSONの仕様としてダブルクォーテーションで囲む必要があります。

ただし、論理値や数値に関しては囲む必要はありません。

{
 "bool": true,
 "integer": 100
}

他にも、上記のように値が複数あった場合は、カンマで区切ります。

ですが、最後の値に関してカンマをつけるのはダメです。

その為、下記はNGになります。

{
 "bool": true,
 "integer": 100, <- 最後の値にカンマがついてるのでNG
}

配列とオブジェクトの書き方

オブジェクトとした場合は、{と}でくくります。

配列の場合は、[と]になります。

オブジェクトの場合

{
 "キー": "値"
}

配列の場合

[
 {"キー": "値"},
 {"キー": "値"}
]

Python標準のJSONの使い方

Pythonには標準のJSONを取り扱うことができるモジュールがあります。

そのため、インストールする必要がなく利用することができます。

JSON文字列をエンコード

Pythonで作成した文字列をJSONエンコードして、利用できるようにします。

文字列をエンコードするには、loads関数を利用します。

ファイルの読み込みではload関数ですが、ここではloads関数になります。

import json

json_data = '{"sample": "テスト"}'

data = json.loads(json_data)
print(data["sample"]) # 結果 テスト

JSONファイルの読み込み

JSONファイルを読み込んでみます。

ファイルを読み込むのは、テキストファイルを読み込み方と同じでopenしたデータをJSONのload関数に入れるだけです。

読み込みJSONファイルは下記になります。

{
  "accounts": [
    {
      "name": "太郎",
      "age": 20
    },
    {
      "name": "次郎",
      "age": 19
    }
  ]
}

JSONファイルを読み込むコードが下記になります。

import json

with open('./sample.json') as f:
    data = json.load(f)
    print(data)

結果は、下記になります。

{'accounts': [{'name': '太郎', 'age': 20}, {'name': '次郎', 'age': 19}]}

出力するJSONが見づらい場合はdumpsを使う

printなどで出力したJSONが1行で見づらい場合は、dumpsを使いましょう。

dumpsを使うことで、綺麗に出力することができます。

読み込むJSONは、sample.jsonです。

JSONファイルの読み込みのセクションで利用したファイルです。

import json

with open('./sample.json') as f:
    data = json.load(f)
    print(json.dumps(data, indent=2, ensure_ascii=False))

json.dumpsで、indentを指定しensure_asciiをFalseにします。

ensure_asciiをFalseにしないと文字化けが発生するので必ずFalseを指定しておきましょう。

結果は下記になります。

{
  "accounts": [
    {
      "name": "太郎",
      "age": 20
    },
    {
      "name": "次郎",
      "age": 19
    }
  ]
}

エンコードとデコード

jsonのdumpsやloadsを使用しましたが、実際loadsはエンコードでdumpsがデコードを行なっています。

typeとして出力するとわかります。

import json

data = {
    'list': [
        {'name': '太郎'},
        {'name': '次郎'},
    ]
}

dec = json.dumps(data, ensure_ascii=False)
enc = json.loads(dec)



print(type(dec)) # <class 'str'>
print(type(enc)) # <class 'dict'>

decでは、辞書型のデータが文字列としてデコードされています。

次に、その文字列のdecをloadsすることでJSONエンコードされて、辞書型として返します。

そのため、loadsはエンコードでdumpsはデコードを行うと覚えましょう。

ファイルへの書き込み

JSONファイルへの書き込みは、テキスト同様にopen関数を利用します。

書き込むためには、dumpを使います。

dumpsではありません。

import json


data = {
    'list': [
        {'name': '太郎'},
        {'name': '次郎'},
    ]
}

with open('write_sample.json', 'w') as f:
    json.dump(data, f, ensure_ascii=False)

書き込まれた結果が下記になります。

{"list": [{"name": "太郎"}, {"name": "次郎"}]}

この状態だと見づらいので、dumpにindentoを指定します。

json.dump(data, f, ensure_ascii=False, indent=2) # indentを追加

インデントを追加することで、書き込まれるデータも見やすくなります。

{
  "list": [
    {
      "name": "太郎"
    },
    {
      "name": "次郎"
    }
  ]
}

他にもdumpsを使ってそのまま、ファイルストリームのwrite関数で書き込むのもアリだと思います。

simplejsonの使い方

simplejsonの使い方

simplejsonは、シンプルで高速で拡張可能なJSONエンコーダーまたはデコーダーになります。

基本的には、Python標準にあるJSONと同じことができます。

importしていたjsonがsimplejsonに変わるだけです。

しかし、処理の速さなどはsimplejsonの方が速いです。

そのため、処理速度を含めて開発を考えてコードを書く人にとっては、simplejsonの方がオススメです。

simplejsonのインストール

インストールするには、pipコマンドを利用してインストールします。

$ pip install simplejson

下記のようにSuccessfullyが表示されるとインストール成功です。

Collecting simplejson
  Downloading simplejson-3.17.5-cp39-cp39-macosx_10_9_x86_64.whl (74 kB)
     |████████████████████████████████| 74 kB 2.0 MB/s 
Installing collected packages: simplejson
Successfully installed simplejson-3.17.5

GeoJSONの使い方

GeoJSONの使い方

GeoJSONは、地図や座標などのデータをJSON形式にするモジュールです。

GeoJSONのインストール

インストールするには、pipコマンドを利用します。

$ pip install geojson

下記のように、Successfullyが表示されるとインストールは成功です。

Collecting geojson
  Downloading geojson-2.5.0-py2.py3-none-any.whl (14 kB)
Installing collected packages: geojson
Successfully installed geojson-2.5.0

座標の指定

座標を指定するために、Pointを使います。

Pointを使うことで、自動的に座標用にJSONフォーマットがされます。

from geojson import Point

data = Point((-90.50, 50.38))
print(data)

結果は下記になります。

{"coordinates": [-90.5, 50.38], "type": "Point"}

複数座標の指定

Pointだと一つの座標しか指定できませんが、複数の座標を指定するには、MultiPointを利用します。

MultiPointを利用することで、複数の座標をいっきに設定することができます。

from geojson import MultiPoint

get_list = [(50, 30), (-156.22, 30.85)]
data = MultiPoint(get_list)
print(data)

MultiPointでリストをセットするだけです。

結果は、coordinatesに複数の値が設定されているのがわかります。

{"coordinates": [[50, 30], [-156.22, 30.85]], "type": "MultiPoint"}

まとめ

Python標準のjsonモジュールを利用してみました。

使い方についてはとくに難しくなく、すんなり利用することができます。

simplejsonについてこの記事で解説してませんが、一応試してみました。

特に使い方も同じで、標準のjsonを使うより速いとのことなので、simplejsonを使うことをオススメします。

GeoJSONについては、地理系やカメラなどの座標系のアプリを作るなら使い方など覚えておいた方が良いと感じました。

今後は動画や画像系の処理も書いていければと思います。

他にもPythonでいろいろなファイルの読み書きを解説しています。

ご興味があれば、下記の記事もご覧ください。

Pythonファイル操作
Pythonでいろんな種類のファイルを操作方法を解説
Pythonを使って、テキストやJSON、YAMLといったさまざまなファイルの読み書きに関してピックアップしてみました。 調べてみてわかったことは、ほとんどのモジュールが書き込みと読み込みで同じような書き方になっていました。 そのため、数種 ...

続きを見る

Udemyへ

今後の人生を豊かにする為にキャリアアップのステップとして、自分への投資をしてみませんか?

-Python
-,