2017-05-28 95 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键,但我不能收集所有在所有单独的字典中键对应的数据变成列表(或其他)。任何关于以任何数据类型收集它们的帮助都会非常有帮助。我的目标是打印日期与他们对应的白天高点。

感谢您阅读(并帮助), 一个小白到API的

附:如果需要的话,这是我使用来获取信息的脚本的副本,它使用气象局(这是英国一个天气预报网站)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(只有这么一个值)的第二个列表元素,可以进一步简化为:

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 & Location
    • `DV ['dataDate']只是'2017-05-28T17:00:00Z',即生成数据时。
    • DV ['location'] is a dictionary with members'i','lat','lon','name','country','continent','elevation','Period',其中大部分是显而易见的。
    • DV['location']['Period']长度5 表明在5天的列表预测
    • 每个条目是键'type', 'value', 'Rep'字典其中&类型值是“日”和分别的日期。
    • 每个DV['location']['Period'][ñ]['Rep']是每个成员'D', 'Gn', 'Hn', 'PPd', 'S', 'V', 'Dm', 'FDm', 'W', 'U', '$'这恰好是data['Wx']['Param']名称与$除外,它要么是DayNight

所以基本上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]) 

并获得:

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         
相关问题