Python と JSON

Python では json モジュールをインポートすると、簡単に JSON のデータを Python のオブジェクトに変換できる。これをテストするのに自分で JSON データを作るのは面倒だし、面白くないのでオープンデータを利用してみた。次のサイトでは無料で API を使って鉄道路線に関する JSON データを利用することができる。


HeatRails Express のホームページの API タグをクリックすると路線データを取得するための API の説明が記載してある。今回は単に JSON データが欲しいだけなので、「駅情報取得 API」のサンプルレスポンスの「新宿」に合致する駅の情報の一覧のクエリのリンクを右クリックして JSON ファイル json.json をダウンロードした。ファイル名は sinjuku.json に変更した。

Windows のスタートメニューから [Anaconda3 (64-bit)] - [Anaconda Prompt] を選択。ダウンロードした sinjuku.json のあるディレクトリに移動し、ipython を起動した。

まずファイルのデータを文字列 sinjuku_file に取り込む。
In [1]: sinjuku_file = オープン('sinjuku.json','rt',encoding='utf-8').リード()

*オープンとリードは実際には英小文字で入力

json モジュールをインポートし、
In [2]: import json

文字列をオブジェクトの sinjuku に変換する。
In [3]: sinjuku = json.loads(sinjuku_file)

sinjuku オブジェクトの内容は次のようになる。
In [4]: sinjuku
Out[4]:
{'response': {'station': [{'line': 'JR中央線',
'name': '新宿',
'next': '大久保',
'postal': '1600022',
'prefecture': '東京都',
'prev': '代々木',
'x': 139.700464,
'y': 35.689729},
{'line': 'JR埼京線',
'name': '新宿',
'next': '池袋',
'postal': '1600022',
'prefecture': '東京都',
'prev': '渋谷',
'x': 139.700464,
'y': 35.689729},
.....

response と station のキーは不要なので取り除くと検索結果のオブジェクトのリストが得られる。
In [5]: sinjuku = sinjuku['response']['station']

このリストから内包表記で路線と前後の駅のタプルのリストを作る。
In [6]: [(stn['line'],stn['prev'],stn['next']) for stn in sinjuku]
Out[6]:
[('JR中央線', '代々木', '大久保'),
('JR埼京線', '渋谷', '池袋'),
('JR山手線', '代々木', '新大久保'),
('JR湘南新宿ライン', '池袋', '渋谷'),
('JR総武線', '大久保', '代々木'),
('京王線', None, '笹塚'),
('小田急小田原線', None, '南新宿'),
('東京メトロ丸ノ内線', '新宿三丁目', '西新宿'),
('都営大江戸線', '代々木', '都庁前'),
('都営新宿線', None, '新宿三丁目')]

JSON データをオブジェクトに変換するのも、オブジェクトの処理も簡単だった。

[PR]
by tnomura9 | 2018-03-27 07:53 | Python | Comments(0)
<< Python によるデータ分析入門 jupyter notebook >>