有效的JSON类型文件操作方式

时间:2016-06-27 09:22:29

标签: python json mongodb data-analysis bigdata

所以,我有一个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的信息,该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中做到这一点?所以,如果有人可以建议我应该使用什么,并给出一些基础知识开始将是非常有帮助的。感谢

2 个答案:

答案 0 :(得分:1)

你这样实现。它实现了基本的字典操作。该概念创建了一个列表,其中包含no.of访问和城市名称。并使用密钥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 %']

答案 1 :(得分:0)

您可以在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