2017-05-28 11 views
0

私はAPIには非常に慣れています。私は自分の都市の日の時間を教えてくれるPythonスクリプトを作成しようとしています。私は、APIがうまく設定していると、それは出力データはこれです:APIを使用して同じ名前の複数のキーからすべてのデータを取得するpython

{ 
    "SiteRep":{ 
      "Wx":{ 
       "Param":[ 
       { 
        "name":"FDm", 
        "units":"C", 
        "$":"Feels Like Day 
        Maximum Temperature" 
       }, 
       { 
        "name":"FNm", 
        "units":"C", 
        "$":"Feels Like Night Minimum Temperature" 
       }, 
       { 
        "name":"Dm", 
        "units":"C", 
        "$":"Day Maximum Temperature" 
       }, 
       { 
        "name":"Nm", 
        "units":"C", 
        "$":"Night Minimum Temperature" 
       }, 
       { 
        "name":"Gn", 
        "units":"mph", 
        "$":"Wind Gust Noon" 
       }, 
       { 
        "name":"Gm", 
        "units":"mph", 
        "$":"Wind Gust Midnight" 
       }, 
       { 
        "name":"Hn", 
        "units":"%", 
        "$":"Screen Relative Humidity Noon" 
       }, 
       { 
        "name":"Hm", 
        "units":"%", 
        "$":"Screen Relative Humidity Midnight" 
       }, 
       { 
        "name":"V", 
        "units":"", 
        "$":"Visibility" 
       }, 
       { 
        "name":"D", 
        "units":"compass", 
        "$":"Wind Direction" 
       }, 
       { 
        "name":"S", 
        "units":"mph", 
        "$":"Wind Speed" 
       }, 
       { 
        "name":"U", 
        "units":"", 
        "$":"Max UV Index" 
       }, 
       { 
        "name":"W", 
        "units":"", 
        "$":"Weather Type" 
       }, 
       { 
        "name":"PPd", 
        "units":"%", 
        "$":"Precipitation Probability Day" 
       }, 
       { 
        "name":"PPn", 
        "units":"%", 
        "$":"Precipitation Probability Night" 
       } 
      ] 
      }, 
       "DV":{ 
        "dataDate":"2017-05-28T17:00:00Z", 
        "type":"Forecast", 
        "Location":{ 
         "i":"350896", 
         "lat":"50.8371", 
         "lon":"-0.7734", 
         "name":"LONDON", 
         "country":"ENGLAND", 
         "continent":"EUROPE", 
         "elevation":"14.0", 
         "Period":[ 
         { 
          "type":"Day", 
          "value":"2017-05-28Z", 
          "Rep":[ 
          { 
           "D":"SE", 
           "Gn":"9", 
           "Hn":"66", 
           "PPd":"51", 
           "S":"7", 
           "V":"GO", 
           "Dm":"22", 
           "FDm":"20", 
           "W":"7", 
           "U":"6", 
           "$":"Day" 
          }, 
          { 
           "D":"ENE", 
           "Gm":"20", 
           "Hm":"85", 
           "PPn":"42", 
           "S":"9", 
           "V":"VG", 
           "Nm":"16", 
           "FNm":"15", 
           "W":"12", 
           "$":"Night" 
          } 
          ] 
         }, 
         { 
          "type":"Day", 
          "value":"2017-05-29Z", 
          "Rep":[ 
          { 
           "D":"SW", 
           "Gn":"13", 
           "Hn":"91", 
           "PPd": "59", 
           "S":"9", 
           "V":"GO", 
           "Dm":"18", 
           "FDm":"16", 
           "W":"12", 
           "U":"5", 
           "$":"Day" 
          }, 
          { 
           "D":"W", 
           "Gm":"13", 
           "Hm":"93", 
           "PPn":"7", 
           "S":"7", 
           "V":"GO", 
           "Nm":"13", 
           "FNm":"12", 
           "W":"7", 
           "$":"Night" 
          } 
          ] 
         }, 
         { 
          "type":"Day", 
          "value":"2017-05-30Z", 
          "Rep":[ 
          { 
           "D":"WSW", 
           "Gn":"25", 
           "Hn":"75", 
           "PPd":"9", 
           "S":"13", 
           "V":"VG", 
           "Dm":"18", 
           "FDm":"15", 
           "W":"7", 
           "U":"5", 
           "$":"Day" 
          }, 
          { 
           "D":"WNW", 
           "Gm":"13", 
           "Hm":"89", 
           "PPn":"5", 
           "S":"9", 
           "V":"VG", 
           "Nm":"11", 
           "FNm":"10", 
           "W":"0", 
           "$":"Night" 
          } 
          ] 
         }, 
         { 
          "type":"Day", 
          "value":"2017-05-31Z", 
          "Rep":[ 
          { 
           "D":"SW", 
           "Gn":"13", 
           "Hn":"58", 
           "PPd":"3", 
           "S":"4", 
           "V":"VG", 
           "Dm":"19", 
           "FDm":"18", 
           "W":"1", 
           "U":"7", 
           "$":"Day" 
          }, 
          { 
           "D":"NE", 
           "Gm":"9", 
           "Hm":"87", 
           "PPn":"2", 
           "S":"4", 
           "V":"VG", 
           "Nm":"10", 
           "FNm":"9", 
           "W":"0", 
           "$":"Night" 
          } 
          ] 
         }, 
         { 
          "type":"Day", 
          "value":"2017-06-01Z", 
          "Rep":[ 
          { 
           "D":"ESE", 
           "Gn":"18", 
           "Hn":"56", 
           "PPd":"0", 
           "S":"9", 
           "V":"VG", 
           "Dm":"19", 
           "FDm":"18", 
           "W":"1", 
           "U":"8", 
           "$":"Day" 
          }, 
          { 
           "D":"E", 
           "Gm":"13", 
           "Hm":"80", 
           "PPn":"1", 
           "S":"9", 
           "V":"VG", 
           "Nm":"11", 
           "FNm":"9", 
           "W":"0", 
           "$":"Night" 
          } 
          ] 
         } 
         ] 
        } 
       } 
     } 
    } 

問題は、私はこれらの辞書でのDMのキーであるすべての昼間の高いユニットを、プリントアウトしたいですが、私はすべてを集めることができませんキーがすべての別々の辞書に対応するデータをリスト(または他のもの)に変換します。任意のデータ型でそれらを収集するのに役立つと、本当に役に立ちます。私の目標は、日中の最高値に対応する日付をプリントアウトすることです。

はP.S.

APIへのnoobの 、読書(と助けて)いただき、ありがとうございますそれが必要とされる場合、これは私が情報を取得するために使用しているスクリプトのコピーである、それは気象庁を使用しています(これは英国の天気予報サイトです)API:私の知る限りとして

import urllib.request, json, codecs 

url = 'Insert API here' 
json_obj = urllib.request.urlopen(url) 
reader = codecs.getreader("utf-8") 
data = json.load(reader(json_obj)) 
print (data) 

答えて

0

あなたのデータはSiteRep -> DV -> Location -> Periodのリスト、特にそのRepの要素にネストされているので、それを繰り返してDmの値を取得し、リストに格納し、各期間がvalueのキーである辞書として保存するだけです。以下のような何か:

dms = {} # use this dict for storage 
for period in data["SiteRep"]["DV"]["Location"]["Period"]: # loop through periods 
    # use Period's 'value' as a key; pick up Dm values and store them as value, as a list 
    dms[period["value"]] = [v["Dm"] for v in period["Rep"] if "Dm" in v] 

print(dms) 
# {'2017-05-29Z': ['18'], '2017-05-28Z': ['22'], '2017-05-30Z': ['18'], 
# '2017-05-31Z': ['19'], '2017-06-01Z': ['19']} 

Dm場合はRep(だけなので、単一の値)の第2のリスト要素に表示されることはありませんあなたはさらにとしてそれを簡略化することができます。でも

dms = {} # use this dict for storage 
for period in data["SiteRep"]["DV"]["Location"]["Period"]: # loop through periods 
    # use Period's 'value' as a key; pick up Dm values and store them as value, as a list 
    dms[period["value"]] = period["Rep"][0]["Dm"] 

print(dms) 
# {'2017-05-29Z': '18', '2017-05-28Z': '22', '2017-05-30Z': '18', 
# '2017-05-31Z': '19', '2017-06-01Z': '19'} 

または:

dms = {p["value"]: p["Rep"][0]["Dm"] for p in data["SiteRep"]["DV"]["Location"]["Period"]} 

print(dms) 
# {'2017-05-29Z': '18', '2017-05-28Z': '22', '2017-05-30Z': '18', 
# '2017-05-31Z': '19', '2017-06-01Z': '19'} 

が最も速いが、読みにくくなる。

+0

おかげで、魔法のように動作します! – Tom

0

私はそれが含まれていることがわかります、あなたのデータを取る:

  • が含まれている唯一のキー、SiteRepと辞書はメンバーWx & DV
    • Wxと辞書が一つのキーを持つ辞書です、 Paramおよび
    • Paramは、それぞれがメンバーを含む辞書のリストです。$,name & units$は説明テキストです。個人的に私はキー

data['SiteRep']['Wx']['Param'][0] ==> { '$': 'Feels Like Day Maximum Temperature', 'name': 'FDm', 'units': 'C'}

として名前の辞書の辞書としてこれを再構築しようとするだろう。しかし、これはでマッピングすることができます。

params = {i['name']:(i['$'], i['units']) for i in data['SiteRep']['Wx']['Param']} 
  • DV dataDatetype & 0のキーを持つ辞書です
    • DV ['dataDate']は、データが生成されたときの「2017-05-28T17:00:00Z」のように単純になります。
    • 'DV [' 場所 '] is a dictionary with members '私は明白であるの最もPeriod'`'、 '緯度'、 '経度'、 '名前'、 '国'、 '大陸'、 '標高を'、'。
    • DV['location']['Period'] 5日示唆長さ5 のリストは、各エントリは、タイプ&値が「日」と、それぞれの日付ですキー'type', 'value', 'Rep'と辞書です。
    • を予測しました
    • DV['location']['Period'][N]['Rep']はちょうどので、基本的にのいずれかであるDay又はNight

$を除いてdata['Wx']['Param']内の名前であることを起こるメンバー'D', 'Gn', 'Hn', 'PPd', 'S', 'V', 'Dm', 'FDm', 'W', 'U', '$'と2つの辞書それぞれのリストでありますあなたが必要とするデータのすべては、あなたが少しだけをドリルダウンする必要があります。

paramsのマッピングを使用して、私は印刷することができdata['SiteRep']['DV']['Rep'][0]のローカル変数D0た:

print('Date:', d0['value']) 
for f in d0['Rep']: 
    print(f['$']) 
    for k,v in f.items(): 
     if k in params: 
      print(params[k][0], v, params[k][1]) 

をとget:

Date: 2017-05-28Z 
Day            
Wind Direction SE compass       
Wind Gust Noon 9 mph        
Screen Relative Humidity Noon 66 %     
Precipitation Probability Day 51 %     
Wind Speed 7 mph         
Visibility GO          
Day Maximum Temperature 22 C      
Feels Like Day Maximum Temperature 20 C   
Weather Type 7          
Max UV Index 6          
Night            
Wind Direction ENE compass       
Wind Gust Midnight 20 mph       
Screen Relative Humidity Midnight 85 %    
Precipitation Probability Night 42 %    
Wind Speed 9 mph         
Visibility VG          
Night Minimum Temperature 16 C      
Feels Like Night Minimum Temperature 15 C   
Weather Type 12         
関連する問題