У меня есть опыт работы с python в течение нескольких месяцев, теперь несколько онлайн-курсов начинаются в моем собственном проекте. Я нашел интересный веб-сайт, который предоставил данные в json-формате, который я импортирую с помощью библиотеки urllib, разбора с использованием библиотеки json и, в конечном итоге, хочу вставить это в базу данных mysql. Первая и последняя часть этого проекта работают, но не парсинговая часть. Это часть полного файла JSon:Итерирование через json с помощью python
{
"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)
мой результат: типа «ДИКТ» типа «ДИКТ» типа «список»
Как перебирать исходную нагрузку JSon и разобрать данные путем прицеливания?
Спасибо Hansatz за то, что он помог мне. С «parse by sighting» я имею в виду следующее: файл json содержит разные наблюдения за животными, каждый из которых начинается с «type: Feature» в json. Не все эти наблюдения содержат одну и ту же информацию, но я хочу получить доступные значения для каждого отдельного прицела, поместить это в строку и отправить ее в базу данных. Затем переходите к следующему прицелу и т. Д. Таким образом, я получаю запись базы данных для каждого отдельного прицела. Ваш код работает идеально для получения всех доступных значений (спасибо!), Но я получаю все сразу. Означает ли это объяснение? –
Я обновил код, чтобы вернуть строчную версию json-данных. Это, вероятно, не совсем то, что вы хотите, но это может послужить отправной точкой для вас. – Ben
спасибо @hansatz, это определенно послужило отправной точкой для меня! –