3日目 20:JSONデータの読み込み 自然言語処理100本ノック
3日目です。 昨日徹夜して、朝から今まで寝てたので時間の感覚が狂ってます
第3章
Wikipediaの記事を以下のフォーマットで書き出したファイルjawiki-country.json.gzがある. 1行に1記事の情報がJSON形式で格納される 各行には記事名が”title”キーに,記事本文が”text”キーの辞書オブジェクトに格納され,そのオブジェクトがJSON形式で書き出される ファイル全体はgzipで圧縮される 以下の処理を行うプログラムを作成せよ
JSONデータの読み込み
Wikipedia記事のJSONファイルを読み込み,「イギリス」に関する記事本文を表示せよ.問題21-29では,ここで抽出した記事本文に対して実行せよ.
いつも通り読み込みます。
import json with open ('jawiki-country.json','r',encoding='utf-8_sig') as f: dic=json.load(f)
おっとエラー発生
json.decoder.JSONDecodeError: Extra data: line 2 column 1 (char 38123)
jsonデータのほうを見ると、一つのファイルに複数の辞書構造が詰め込まれているようです。 (文法的に大丈夫なのかこれ)
{"title": "エジプト", "text": "{{otheruses|主...."}{"title": "オーストリア", "text": "{{基礎情報 国\n|略....."}...
仕方がないので、1行ずつ順番に読み込む方法を試します。
import json lst=[] with open ('jawiki-country.json','r',encoding='utf-8_sig') as f: for line in f.readlines(): dic=json.loads(line) lst.append(dic) print(lst)
成功!
ここまでくればあとは、全部見てイギリスのところを出力するだけ
for dic in lst: if dic['title']=='イギリス': print(dic['text'])
補足:json.loadとjson.loadsについて
jsonにはjson.loadとjson.loadsの2つの読み込みメソッドがあります。 違いなのですが、どうやら - json.loadはjsonファイルオブジェクト→辞書型への変換 - json.loadsはjson文字列→辞書型への変換 ということみたいです。
感想
そろそろこなれてきました