对JSON类型文件进行操作的有效方法



所以,我有一个JSON文件,它是一个大的,并不断增加。所以,我在这里展示一个简单的版本。

{
"b0:47:bf:af:c1:42": 
 {
 "No. of visits": 10, "cities": 
    {
      "Mumbai": {"count": 5,"last_visited": "5/22/2016"},
      "Kolkata": {"count": 2,"last_visited": "5/22/2016"},
      "Amritsar":{"count": 3,"last_visited": "5/22/2016"}
     }
},
"c0:ee:fb:71:be:0d": 
 {
 "No. of visits": 24, "cities": 
    {
      "Mumbai": {"count": 2,"last_visited": "5/22/2016"},
      "Kolkata": {"count": 20,"last_visited": "5/22/2016"},
      "Amritsar":{"count": 2,"last_visited": "5/22/2016"}
     }
  }
}

基本上它包含关于id的信息它基本上是mac_address b0:47:bf:af:c1:42并且与一个用户相关。所以,我想要的是对JSON进行操作,并将输出存储在数据帧类型的结构中。

就像我想知道用户的最大访问城市和他/她的总访问百分比max_visited城市。

所以,我想要一个类似于以上数据的输出。

mac_address             max_vis city        %visit to max_vis city
b0:47:bf:af:c1:42       Mumbai              50%
k0:k0:k0:k0:k0:k0       Kolkata             83%

应该使用什么样的工具来简单有效地对JSON进行这种操作。我听说MongoDB可以用于此,但我不知道。之前我试着用python来做这个有没有一种有效的方法来用python来做?所以,如果有人能建议我应该用什么,并给出一些基本的开始,这将是非常有帮助的。由于

您可以这样实现。它是用基本的字典操作实现的。概念是创建一个带有no的列表的列表。访问和城市名称。用键itemgetter来排序。通过简单的数学运算,得到最大访问城市,并得到百分比。

from operator import itemgetter
for key,value in main_dict.items():
    sorted_list = sorted([[val['count'],key1] for key1,val in value['cities'].items()],key=itemgetter(0))[-1]
    print [key,sorted_list[1],str(round(float(sorted_list[0])/float(value['No. of visits'])*100,2))+' %']
结果

['b0:47:bf:af:c1:42', 'Mumbai', '50.0 %']
['c0:ee:fb:71:be:0d', 'Kolkata', '83.33 %']

您可以使用Python中的json库。它接受一个字符串,并返回一个dict,然后您可以解析它。

虽然我对Rahul的回答没有异议,但我认为使用max函数和json.

的基本数据结构更简洁。
import json
from collections import OrderedDict
# You load this however you want. 
the_string = """{
"b0:47:bf:af:c1:42": 
 {
 "No. of visits": 10, "cities": 
    {
      "Mumbai": {"count": 5,"last_visited": "5/22/2016"},
      "Kolkata": {"count": 2,"last_visited": "5/22/2016"},
      "Amritsar":{"count": 3,"last_visited": "5/22/2016"}
     }
},
"c0:ee:fb:71:be:0d": 
 {
 "No. of visits": 24, "cities": 
    {
      "Mumbai": {"count": 2,"last_visited": "5/22/2016"},
      "Kolkata": {"count": 20,"last_visited": "5/22/2016"},
      "Amritsar":{"count": 2,"last_visited": "5/22/2016"}
     }
  }
}"""
print('{:20} {:20s} {:20s}'.format('mac_addr' , 'max_vis_city', '% visits' ))
json_object = json.loads(the_string, object_pairs_hook=OrderedDict)
for item in list(json_object):
    max_value = max (json_object[item]["cities"], key=lambda k: json_object[item]["cities"][k]["count"])
    print('{:20s} {:20s} {:<20.0f}'.format(item, max_value, round(json_object[item]["cities"][max_value]["count"]/json_object[item]["No. of visits"] * 100)))
输出:

mac_addr             max_vis_city         % visits
b0:47:bf:af:c1:42    Mumbai               50
c0:ee:fb:71:be:0d    Kolkata              83

相关内容

  • 没有找到相关文章