jsonファイルの取り扱いについて学んだので、今回のテーマはjsonファイルの取り扱いについてです。jsonファイルはwebページのレスポンスなどに使われる非常にメジャーなファイル形式です。
今回、これを学んだきっかけは、仮想通貨取引所のAPIから売買価格を取り、チャートを作るプログラムを書いているのですが、クラスをインスタンス化する時の諸設定をjsonファイルで渡すようにしようと思い立ったからです。簡単な勉強はしたのですが、完全に忘れていたので、もう一度ググって学びなおしました。
jsonファイルの基本的な取り扱いはファイルオブジェクトに似ています。また、jsonファイルの一般的な取り扱いに利用されるjsonモジュールは、pythonの標準モジュールになるため、インストールは不要です。
PythonでのJsonファイルの取り扱いの基本的な流れ
書き込みの場合と読み込みの場合の基本的な流れは以下になります。
<書き込みの場合>
・ Jsonファイル書き込み用の文字列、辞書を生成 -> open関数でファイルを"書き込みモード"で開き、ファイルオブジェクトを作成 ※対象ファイルが存在しない場合、新たに作成される -> json.dumpメソッドでファイルに書き込み -> close関数でjsonファイルを閉じる
<読み込みの場合>
・open関数でjsonファイルを"読み込みモード"で開き、ファイルオブジェクトを生成 -> json.loadメソッドでjsonファイルを読み込み -> close関数でjsonファイルを閉じる
PythonのJsonモジュールのコード
以下が参考コードになります。次のような構成にしてあります。jsonファイルに書き込み内容、読み込む内容はともに辞書型のデータにしていますが、文字列も基本的な対応は同じになります。
- jsonファイルへの書き込み
- indent引数を用いたjsonファイルへの綺麗な書き込み
- jsonファイルの読み込み
- 辞書型表記されたjsonファイルからの特定の値の抽出
- 辞書型を文字列に変えるjson.dumpsメソッド
順にコードを表示していきます。
#jsonファイルへの書き込み
import json
json_data = {'URL':'https://api.bitflyer.jp/v1/getexecutions'
,'count':500
,'after':0
,'before':500
,'csvfile':'test.csv'
}
jsonfile = open('test.json', 'w') #ファイルオブジェクトの作成(ファイルが存在しない場合は新たにファイルが作られる。書き込みモード)
no_indent = json.dump(json_data, jsonfile) #jsonファイルに書き込み(第1引数=書き込み内容、第2引数=データを書き込むファイルオブジェクト)
jsonfile.close()
#ファイルの中身(一列表記)
#{"URL": "https://api.bitflyer.jp/v1/getexecutions", "count": 500, "after": 0, "before": 500, "csvfile": "test.csv"}
基本的な流れは極めてシンプルです。しかし、ファイルの中身が横一列表記と見にくい表記になっているため、インデント引数を指定して整形することができます。なお、書き込み内容を整形する引数は他にもありますので、そちらは公式ドキュメントなどを参照ください。
#indent引数を用いたjsonファイルへの綺麗な書き込み
jsonfile = open('test.json', 'w') #ファイルオブジェクトの作成(ファイルが存在しない場合は新たにファイルが作られる。書き込みモード)
indent = json.dump(json_data, jsonfile, indent=2) #インデントを指定
jsonfile.close()
#ファイルの書き込み内容
#{
# "URL": "https://api.bitflyer.jp/v1/getexecutions",
# "count": 500,
# "after": 0,
# "before": 500,
# "csvfile": "test.csv"
#}
次は読み込みについてですが、こちらも基本的な流れは以下になります。
#jsonファイルの読み込み
a=open('test.json', 'r') #ファイルオブジェクトの作成(読み込みモード)
b=json.load(a) #jsonファイルの読み込み->pythonオブジェクトに変換(辞書型)
a.close()
print(b)
type(b)
戻り値は以下になります。
{'URL': 'https://api.bitflyer.jp/v1/getexecutions', 'count': 500, 'after': 0, 'before': 500, 'csvfile': 'test.csv'} Out[1]: dict
Pythonの辞書型で抽出されていることがわかります。そのため、特定のキーに対応する値も取り出すことができます。
#辞書型表記されたjsonファイルからの特定の値の抽出
b['count']
戻り値
500
最後に紛らわしいjsonモジュールのdumpsメソッドについてです。これは、辞書型を文字列に変えるといった、str型への変形を行うためのメソッドです。以下が参考コードです。
#辞書型を文字列に変えるjson.dumpsメソッド
a=open('test.json', 'r') #ファイルオブジェクトの作成(読み込みモード)
b=json.load(a) #jsonファイルの読み込み
c = json.dumps(b)
a.close()
c
戻り値は以下です。str型になっているのがわかります。
'{"URL": "https://api.bitflyer.jp/v1/getexecutions", "count": 500, "after": 0, "before": 500, "csvfile": "test.csv"}'
まとめ
jsonファイルは、jsonモジュールで極めて簡単に扱うことができます。一方で、サードパーティーモジュールのrequestsモジュールなどでも独自にjsonを処理するメソッドを持っていたりします。非常に広範に使用されるjsonファイルですので、様々な利用の仕方を掴んでいく必要があると感じます。
今回も1人でも参考になる方がいれば幸いです。