从json中删除缺少属性的条目

时间:2015-10-08 20:37:45

标签: python json

我有一个json文件,其中包含大约100,000行,格式如下:

{
"00-0000045": {
    "birthdate": "5/18/1975",
    "college": "Michigan State",
    "first_name": "Flozell",
    "full_name": "Flozell Adams",
    "gsis_id": "00-0000045",
    "gsis_name": "F.Adams",
    "height": 79,
    "last_name": "Adams",
    "profile_id": 2499355,
    "profile_url": "http://www.nfl.com/player/flozelladams/2499355/profile",
    "weight": 338,
    "years_pro": 13
},
"00-0000108": {
    "birthdate": "12/9/1974",
    "college": "Louisville",
    "first_name": "David",
    "full_name": "David Akers",
    "gsis_id": "00-0000108",
    "gsis_name": "D.Akers",
    "height": 70,
    "last_name": "Akers",
    "number": 2,
    "profile_id": 2499370,
    "profile_url": "http://www.nfl.com/player/davidakers/2499370/profile",
    "weight": 200,
    "years_pro": 16
    }
}

我正在尝试删除所有没有gsis_name属性的项目。到目前为止我有这个python代码,但它不删除任何值(注意:我不想覆盖原始文件)

import json

with open("players.json") as json_file:
    json_data = json.load(json_file)
    for x in json_data:
        if 'gsis_name' not in x:
            del x
print json_data

3 个答案:

答案 0 :(得分:2)

您正在删除x,但x是json_data中原始元素的副本;删除x实际上不会将其从绘制它的对象中删除。

在Python中,如果你想从一个集合中过滤掉一些项目,最好的办法是将你想要的项目复制到一个新的集合中。

clean_data =  {k: v for k, v in json_data.items() if 'gsis_name' in v}

然后将clean_data写入json.dump的文件。

答案 1 :(得分:0)

只需创建没有不需要的元素的新dict:

res = dict((k, v) for k, v in json_data.iteritems() if 'gsis_name' in json_data[k])

从Python 2.7开始,你可以使用dict理解。

答案 2 :(得分:0)

当您说del x时,您从当前范围取消分配名称x(在本例中为全局范围,因为删除不在类或函数中)。

您需要从对象json_data中删除它。 json.load返回一个dict,因为你的主对象是一个关联数组/ map / Javascript对象。当您迭代一个字典时,您正在迭代键,因此x是一个键(例如" 00-0000108")。这是一个错误:您想要检查是否具有密钥gsis_name

dict的文档向您展示了如何使用密钥从字典中删除:https://docs.python.org/3/library/stdtypes.html#mapping-types-dict

  

del d[key]

     

d 中删除d[key]。如果不在地图中,则引发KeyError

但正如其他答案所说,最好用你想要的对象创建一个新的dict,而不是删除你不想要的对象。