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)

成功!

f:id:moscwa:20200416152215p:plain
実行結果
分かってたけどすごい量・・

ここまでくればあとは、全部見てイギリスのところを出力するだけ

for dic in lst:
    if dic['title']=='イギリス':
        print(dic['text'])

f:id:moscwa:20200416152744p:plain
実行結果2
ひとまず成功・・なのかな?

補足:json.loadとjson.loadsについて

jsonにはjson.loadとjson.loadsの2つの読み込みメソッドがあります。 違いなのですが、どうやら - json.loadはjsonファイルオブジェクト→辞書型への変換 - json.loadsはjson文字列→辞書型への変換  ということみたいです。

感想

そろそろこなれてきました