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()
でいい感じに出力- より詳しい説明は他の記事に譲る