PythonでJOSNファイルを読み込む方法。
JSONのファイルを読み込む時は
jsonモジュールを利用するのがスマートだ。
jsonモジュールは標準ライブラリに含まれているので、
import文を書くだけで良い。
import json
今回扱うデータ
今回扱うデータは、以下のような構造化されたデータ。
sample_data.json
{ "東京都": { "id": 1, "city": ["千代田区", "港区", "渋谷区"] }, "大阪府": { "id": 2, "city": ["大阪市", "堺市", "貝塚市"] } }
JSONファイルを辞書として読み込む
JSONのような構造化データは、Pythonでは辞書型として扱う。
import json with open('sample_data.json', 'r') as file: # load()関数を使ってデータを辞書型のデータとして読み込む data = json.load(file) # 読み込んだデータを出力 print('そのまま出力: ' + str(data)) # 辞書型では、キーを指定すればそれに紐づく値が取れる print('東京都のみ抽出: ' + str(data['東京都'])) # 出力結果 そのまま出力: {'東京都': {'id': 1, 'city': ['千代田区', '港区', '渋谷区']}, '大阪府': {'id': 2, 'city': ['大阪市', '堺市', '貝塚市']}} 東京都のみ抽出: {'id': 1, 'city': ['千代田区', '港区', '渋谷区']}
取り出したデータを整形する
JSONデータを読み込む方法とは直接関係ないが、
読み込んだJSON形式のデータを出力するときには
いい感じに整形して表示したいという気持ちがある。
辞書型のデータを整形して出力したい場合はpprint
モジュールが有効だが、
元データがJSONだと分かっている場合はjson
モジュールの関数を利用するのがスマートである。
ポイントは3つだ。
json.dumps()
関数を利用するindent=
を指定するensure_ascii=
を指定する
import json with open('sample_data.json', 'r') as file: # jsonファイルを読み込む data = json.load(file) # デフォルトでは非ASCII文字はエスケープされてしまうし、インデントもされない print('-- 引数未指定で出力 ---') print(json.dumps(data)) # ensure_ascii=Falseを指定すると、文字がエスケープされなくなる print('-- 文字コードをそのまま出力するように指定して出力 ---') print(json.dumps(data, ensure_ascii=False)) # indent=2で、インデントのサイズを指定することができる print('-- インデントを指定して出力 ---') print(json.dumps(data, ensure_ascii=False, indent=2)) # 出力結果 -- 引数未指定で出力 --- {"\u6771\u4eac\u90fd": {"id": 1, "city": ["\u5343\u4ee3\u7530\u533a", "\u6e2f\u533a", "\u6e0b\u8c37\u533a"]}, "\u5927\u962a\u5e9c": {"id": 2, "city": ["\u5927\u962a\u5e02", "\u583a\u5e02", "\u8c9d\u585a\u5e02"]}} -- 文字コードをそのまま出力するように指定して出力 --- {"東京都": {"id": 1, "city": ["千代田区", "港区", "渋谷区"]}, "大阪府": {"id": 2, "city": ["大阪市", "堺市", "貝塚市"]}} -- インデントを指定して出力 --- { "東京都": { "id": 1, "city": [ "千代田区", "港区", "渋谷区" ] }, "大阪府": { "id": 2, "city": [ "大阪市", "堺市", "貝塚市" ] } }
まとめ
- jsonモジュールを使えば大抵のJSONデータ操作は行える
json.load()
で読み込みjson.dumps()
でいい感じに出力- より詳しい説明は他の記事に譲る