[英]iterating through json with python
我已经学习python几个月了,现在在我自己的项目上开始了几项在线课程。 我发现了一个有趣的网站,该网站以json格式提供了数据,我使用urllib库导入了该数据,使用json库进行了解析,最终希望将其插入到mysql数据库中。 此项目的第一部分和最后一部分工作,但没有解析部分。 这是完整json文件的一部分:
{
"total": 24555,
"results": {
"type": "FeatureCollection",
"features": [
{
"type": "Feature",
"geometry": null,
"id": "556897c8b9a2143b1187cf79",
"properties": {
"Expedition": "okavango_15",
"SpeciesName": "African Hoopoe",
"Count": 1,
"t_utc": 1325383950,
"t_created": 1432917960.344582,
"Member": "Maans",
"Taxonomy": {
"Kingdom": "Animalia",
"Species": "Upupa epops",
"Family": "Upupidae",
"Genus": "Upupa",
"Phylum": "Chordata",
"Order": "Upupiformes",
"Class": "Aves"
},
"FeatureType": "sighting",
"Images": [],
"DateTime": "2012-01-01T04:12:30+0200",
"EstimatedGeometry": null,
"Behavior": "Flying",
"Habitat": "Mioambo Woodland"
}
},
{
"type": "Feature",
"geometry": null,
"id": "556897b2b9a2143b1d14a807",
"properties": {
"Expedition": "okavango_15",
"SpeciesName": "Peregrine Falcon",
"Count": 1,
"t_utc": 1325406263,
"t_created": 1432917938.878641,
"Member": "Maans",
"Taxonomy": {
"Kingdom": "Animalia",
"Species": "Falco peregrinus",
"Family": "Falconidae",
"Genus": "Falco",
"Phylum": "Chordata",
"Order": "Falconiformes",
"Class": "Aves"
},
"FeatureType": "sighting",
"Images": [],
"DateTime": "2012-01-01T10:24:23+0200",
"EstimatedGeometry": null,
"Behavior": "Flying",
"Habitat": "Mioambo Woodland"
}
},
{
"properties": {
"SpeciesName": "Reed Cormorant",
"Count": 1,
"Accuracy": 8.0,
"Expedition": "okavango_13",
"t_created": 1430929467.352914,
"Member": null,
"FeatureType": "sighting",
"Altitude": 973.2047942238661,
"t_utc": 1378449600,
"DateTime": "2013-09-06T08:40:00+0200",
"Activity": "L",
"SightingId": 0
},
"geometry": {
"type": "Point",
"coordinates": [
22.345429148371103,
-19.018043140479318
]
},
"id": "554a403bb9a21401a231284f",
"type": "Feature"
}
]
},
"resolution": "full",
"filter": {
"FeatureType": "sighting"
},
"returned": 3,
"order": 1,
"limit": 3
}
为了解析json文件,我使用以下代码:
import json
def remove_nulls(d):
return {k: v for k, v in d.iteritems() if v is not None}
with open('okavango.json') as fhand:
data = json.loads(fhand.read(), object_hook=remove_nulls)
我要从中获取数据的级别位于“功能”中,其中包含动物的目击事件以及很多其他键,例如物种名称,时间戳,位置。 各种景点并不总是包含相同的钥匙,例如,位置并不总是存在。 我确实想通过瞄准思想来解析数据瞄准,因为我希望它成为数据库中的一行。 我可以通过使用以下代码调用每个单独的项目来获取所需的每一点数据:
results = data["results"]
for item in results["features"]:
value1 = item["id"]
value2 = item["properties"]["t_created"]
但这使我的代码很长,我猜应该更容易进行迭代。 但是,我无法获取每个键的单个键/值结果。 我已经使用过.get函数,.values等,但是事实证明,并不是我的json文件中的每个级别都是字典,而是某些东西是列表。 例如,如果我运行此代码:
print type(data)
data2 = data["results"]
print type(data2)
data3 = data2["features"]
print type(data3)
我的结果是这样的:输入'dict'类型'dict'类型'list'
如何遍历原始json加载并通过目击解析数据?
我不明白“通过瞄准解析数据”的含义,但是以下代码将遍历JSON。 如果您调整问题以包括示例所需的输出,我将为您提供更多帮助。
data = json.loads(json_data)
def iterate_item(item):
result_str = ""
if type(item) == dict:
for key in item:
result_str = result_str + key + ": " + iterate_item(item[key])
elif type(item) == list:
for i in item:
result_str = result_str + iterate_item(i) + ", "
else:
if not item:
item = "None"
result_str = result_str + str(item) + ". "
return result_str
for sighting in data["results"]["features"]:
print iterate_item(sighting) + "\n\n"
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.