我有一个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
答案 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,而不是删除你不想要的对象。