【问题标题】:Extracting data from dictionary returned by json.loads从 json.loads 返回的字典中提取数据
【发布时间】:2016-03-25 11:16:50
【问题描述】:

这是我想要做的:提示输入 URL,使用 urllib 从该 URL 读取 JSON 数据,然后从 JSON 数据中解析和提取评论计数并计算它们的总和。

这是我目前在 Python 中所拥有的:

import json
import urllib

serviceurl = 'http://python-data.dr-chuck.net/comments_42.json'

while True:
    url = serviceurl + urllib.urlencode(('sensor':'false', 'address' : address))
    print "Retrieving", url
    uh = urllib.urlopen(url)
    data = uh.read()
    print "Retrieved", len(data), "characters"

    try:    js = json.loads(str(data))
    except:     js = None

    print js.dumps(js, indent = 4)

    js = ["comment"][0]["count"]
    lst = list()
    lst.append(js)
    print sum(lst)

JSON 数据如下所示:

{
  comments: [
    {
      name: "Matthias"
      count: 97
    },
    {
      name: "Geomer"
      count: 97
    }
    ...
  ]
}

我正在使用 Python 2。这是我第一次这样做,因此您可以给我的任何反馈都会有所帮助,尤其是在 try/except 语句之后。提前致谢。

【问题讨论】:

  • 问题是……
  • 你做了js = ["comment"][0]["count"] ...你的意思是js = js["comments"][0]["count"]吗?

标签: python json dictionary python-2.x


【解决方案1】:

js 是一个看起来像这样的字典:

{'comments': [{'count': 97, 'name': 'Matthias'}, {'count': 97, 'name': 'Geomer'}]}

您可以像这样得到所有'count' 值的总和:

sum(nested_dict['count'] for nested_dict in js['comments'])

如果列表中的字典有可能没有'count' 键,请使用默认值为0 的dict.get

sum(nested_dict.get('count', 0) for nested_dict in js['comments'])

【讨论】:

  • 感谢您的回复。我收到 dict 部分的错误。表示 js.dumps(js, indent = 4) 中没有属性。
【解决方案2】:

我也完成了相同的课程并完成了相同的任务。 timgeb 的答案将以更小的代码完成工作。或者,您也可以尝试以下方法:

import json
import urllib
counts = list()
inp = raw_input('Enter a URL: ')

url = urllib.urlopen(inp)
data = url.read()
print len(data)

try:
    js = json.loads(data)
except:
js = None

comments = js['comments']
for comment in comments:
    counts.append(comment['count'])

print sum(counts)

#print sum(nested_dict['count'] for nested_dict in js['comments'])

您不需要对 url 进行任何编码,也不需要 while 循环。该代码段用于使用 google map API。

【讨论】:

    【解决方案3】:

    我的代码版本:

    import json
    import urllib.request, urllib.parse, urllib.error
    total = 0
    
    url = input('Enter URL: ')
    data = urllib.request.urlopen(url).read().decode()
    
    info = json.loads(data)
    number = info["comments"] #getting list of all the dictinaries
    for i in number: #in each dictionary...
        needed = i.get('count') #... we are getting numbers from "count"
        total = total + int(needed) #summ all the numbers
    print(total)
    

    【讨论】:

      【解决方案4】:

      基于 Mudit Sahni 的代码,但为 Python3

      编写
      import urllib.request
      import json
      
      url = input("Enter URL: ")
      response = urllib.request.urlopen(urllib.request.Request(url)).read().decode('utf-8')
      data = json.loads(response)
      counts = list()
      
      comments = data['comments']
      for comment in comments:
          counts.append(comment['count'])
      
      print (sum(counts))
      

      【讨论】:

        【解决方案5】:
        import urllib.request, urllib.parse, urllib.error
        import json
        import ssl
        
        # Ignore SSL certificate errors
        ctx = ssl.create_default_context()
        ctx.check_hostname = False
        ctx.verify_mode = ssl.CERT_NONE
        
        url = input('Enter - ')
        print('Retrieving', url)
        uh = urllib.request.urlopen(url, context=ctx)
        data = uh.read()
        
        info = json.loads(data)
        #print(info) #to see the info dictionary/object
        #print(json.dumps(info, indent=2))  
        
        count = 0
        sum = 0
        
        for item in info['comments']:
            num = item['count']
            sum = sum + int(num)
            count = count + 1
        
        print('Count: ', count)
        print('Sum: ', sum)
        

        【讨论】:

        • 为什么所有的 SSL 语句?问题中没有使用 HTTPS。另外,你有没有注意到这是一个五年前的问题:-)
        • 是的,我注意到了,这是一个五年前的问题。我试图解决一个类似的在线课程问题,并以一种通用的方式解决,以便它也适用于 https。我现在正在学习 python,并认为这可能对某人有所帮助。
        • 很高兴您愿意提供帮助,谢谢!但我认为您不应该建议禁用 TLS 证书验证和主机名检查。随着 Letsencrypt 的出现,使用可信证书正确执行 TLS 比以往任何时候都容易。
        【解决方案6】:
        ##  http://py4e-data.dr-chuck.net/comments_42.json       total= 2553
        ## http://py4e-data.dr-chuck.net/comments_802780.json    total= 2670
        import ssl
        import urllib.request, urllib.parse, urllib.error
        import json
        total= list()
        
        ## Ignore SSL certification
        ctx= ssl.create_default_context
        ctx.check_hostname= False
        ctx.verify_mode= ssl.CERT_NONE
        
        ## Access url
        url= input('Enter URL: ')
        req= urllib.request.urlopen(url, context=ctx)
        html= req.read().decode()
        print('Retrieving URL:', url)
        print('Retrieved', len(html),'characters')
        
        ##accessing data
        js= json.loads(html)
        #print(json.dumps(js, indent=3))
        for counts in js["comments"]:
            #print('Counts:', counts['count'])
            total.append(counts['count'])
        print(sum(total))
        

        【讨论】:

        • 在你的答案中加入解释可能会有所帮助。尽量避免只用代码回答
        【解决方案7】:
        import urllib.request, urllib.parse, urllib.error
        import ssl
        import json
        
        # Ignore SSL certificate errors
        ctx = ssl.create_default_context()
        ctx.check_hostname = False
        ctx.verify_mode = ssl.CERT_NONE
        
        while True:
            count = sum = 0
            url = input('Enter location: ')
            if len(url) < 1: break
            print('Retrieving', url)
            uh = urllib.request.urlopen(url, context=ctx)
            
            data = uh.read()
            print('Retrieved', len(data), 'characters')
            
            info = json.loads(data)
        
            for item in info['comments']:
                count+=1
                sum+=int(item['count'])
            
            print('count:',count)
            print('sum',sum)
        

        【讨论】:

        • 虽然此代码可能会为问题提供解决方案,但最好添加有关其工作原理/方式的上下文。这可以帮助未来的用户学习并将这些知识应用到他们自己的代码中。在解释代码时,您也可能会以赞成票的形式从用户那里获得积极的反馈。
        【解决方案8】:
        from urllib.request import urlopen
        import json
        
        while True:
            url = input('Enter url: ')
            if len(url) < 1:
                break
            print("Retrieving", url)
            uh = urlopen(url)
            data = uh.read().decode()
            print("Retrieved", len(data), "characters")
            try:
                js = json.loads(data)
            except:
                js = None
        
            count = 0
            lst = list()
            for comment in js["comments"]:
                count += 1
                lst.append(comment["count"])
            print("count:", count)
            print(sum(lst))
        

        【讨论】:

          【解决方案9】:
          import urllib.request, urllib.parse, urllib.error
          import json
          
          url = "http://py4e-data.dr-chuck.net/comments_1418532.json"
          info = json.loads(urllib.request.urlopen(url).read())
          
          comm=info['comments']
          counts_list = [int(items['count']) for items in comm]
          
          print(sum(counts_list))
          

          【讨论】:

          • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
          【解决方案10】:
          import json
          import urllib
          
          url=raw_input('Enter location:')
          print 'Retrieving',url
          uh=urllib.urlopen(url)
          data=uh.read()
          
          
          info = json.loads(data)
          print 'Retrieved', len(info)
          sum=0
          counts=0
          for item in info['comments']:
              sum=sum+item['count']
              counts=counts+1
          print 'Counts:',counts
          print 'Sum:',sum
          

          【讨论】:

            【解决方案11】:
            import urllib.request, urllib.parse, urllib.error
            import ssl
            import json
            
            #to ignore SSL certificate errors
            ctx = ssl.create_default_context()
            ctx.check_hostname = False
            ctx.verify_mode = ssl.CERT_NONE
            
            url = input('Enter - ')
            data = urllib.request.urlopen(url, context=ctx).read()
            info = json.loads(data)
            sum_count = 0
            for a in info["comments"]:
                sum_count += int(a["count"])
            print(sum)
            

            【讨论】:

            • 使用sum是python中的一个关键词,这是反对变量命名的。赋值会覆盖它的函数...使用另一个变量名
            猜你喜欢
            • 2013-03-05
            • 1970-01-01
            • 2019-05-04
            • 2014-05-01
            • 2021-10-14
            • 1970-01-01
            • 1970-01-01
            • 2016-04-28
            • 2021-11-25
            相关资源
            最近更新 更多