narudon0911
@narudon0911

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

【Python】気象庁HPから取得したJSONから任意の地域名・日時・天気の情報を取り出す方法

解決したいこと

気象庁HPから取得したJSONを読み出し、任意の地域名・日時・天気の情報のみを出力したいです。
現状は全ての地域名・日時・天気の情報が表示されます。
どのように書けばよろしいでしょうか。

コード

url = 'https://www.jma.go.jp/bosai/forecast/data/forecast/010000.json'
filename = 'tenki.json'

def job():
  import urllib.request as req
  req.urlretrieve(url, filename)
job()

import json
with open('tenki.json', 'r', encoding="UTF-8") as f:
  data = json.load(f)
for area in data:
  name = area['name']
  print("[", name, "]")
  for ts in area['srf']['timeSeries']:
   times = [n for n in ts['timeDefines']]
   if 'weathers' in ts['areas']:
     for i,v in enumerate(ts['areas']['weathers']):
       print(times[i], ":", v)
```

自分で試したこと

JSONファイルをload関数で読み込むと辞書型で保存されているとのことだったので、辞書型の取り出しを入力して実行したものの「TypeError: list indices must be integers or slices, not str」がでます。

0

1Answer

読み込むJSONファイルによって、辞書型だったりリスト型だったりします。
今回はリスト型なので、地域名の取得は次のようになります。

data[0]["name"]  # => "釧路"
data[13]["name"]  # => "高松"

data["name"]だと、そこは文字じゃなくて数字だ! と怒られてしまいます。

また、日時や天気の取得は次のようになります。

data[0]["srf"]["timeSeries"][0]["timeDefines"][0]  # => "2021-05-13T17:00:00+09:00"
data[0]["srf"]["timeSeries"][0]["areas"]["weathers"][0]  # => "くもり\u3000所により\u3000雨"

変数dataのインデックスによって地域が分けられているみたいなので、そこだけ出力したい地域のインデックスに固定して、日時や天気に関しては元のコードと同様のfor文で良いのではないでしょうか。

追記

理解の助けになるよう、簡単なプログラムを書きました。
# リスト
students = ["山田", "佐藤", "田中"]

print(students[0])  # => "山田"
print(students[1])  # => "佐藤"
print(students[2])  # => "田中"


# 辞書
scores = {"山田": 80, "佐藤": 65, "田中": 40}

print(scores["山田"])  # => 80
print(scores["佐藤"])  # => 65
print(scores["田中"])  # => 40


# 混合
classroom = [
    {
        "教師": "木村",
        "生徒": ["山田", "佐藤", "田中"]
    },
    {
        "教師": "武田",
        "生徒": ["井上", "岡田"]
    }
]

print(classroom[0]["教師"])  # => "木村"
print(classroom[1]["生徒"][0])  # => "井上"
0Like

Comments

  1. @narudon0911

    Questioner

    ご回答いただきありがとうございます!
    初心者なもので、基礎的な部分すらおぼつかなくて申し訳ないです。
    お答えいただいた、
    data[0]["srf"]["timeSeries"][0]["timeDefines"][0]
    data[0]["srf"]["timeSeries"][0]["areas"]["weathers"][0]
    これらpythonのリスト型のデータ取得の文法は初めて見たので勉強していこうと思います。
    なんと呼ばれる文法でしょうか?
    よろしくお願いします。
  2. 文法というか、そういうものとしか言えません。
    リストの値はインデックス(数字)でアクセスできる。
    辞書の値はキー(主に文字)でアクセスできる。
    リストの中にリストや辞書を入れることもできますし、辞書の中にリストや辞書を入れることもできます。
    なので、回答のようにごちゃごちゃしているわけです。

    理解の助けになるよう、簡単なプログラムを書いてみました。
    コメントではコードの挿入がうまくいかなかったので、元の回答に追記しておきました。

    インターネット上のデータを処理するというのは、結構難しいことです。
    基礎的な部分が理解できないまま難易度の高いことをやろうとすると、わからないところだらけで挫折してしまうかもしれません。(それでプログラミングが嫌いになってしまうのは残念です)
    なので一度、基礎から学ぶのをおすすめします。
    幸いなことに、Pythonは比較的簡単な言語で、公式ドキュメントも充実しているので、公式のチュートリアルをやってみましょう。
    https://docs.python.org/ja/3/tutorial/index.html
  3. @narudon0911

    Questioner

    たいへん分かりやすい例題まで示していただき本当にうれしいです。
    おっしゃる通り、まだPythonを始めてひと月も経っていません。
    Progateで軽く勉強して、基礎学習偏重よりも何かを作りつつ学ぶ方がいいよとオススメされて今回のような質問をさせていただきました。

    しかし、akarinS様のおっしゃるように基礎も学んでいきます。
    作るのが好きなので、基礎をやりつつプログラムも作成していこうと思います。

    本当にありがとうございます。
    すごくうれしいです。

Your answer might help someone💌