2016-02-09 3 views
0

У меня есть опыт работы с 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 и разобрать данные путем прицеливания?

ответ

1

Я не понимаю, что вы подразумеваете под «анализом данных путем прицеливания», но следующий код будет проходить через ваш 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" 
+0

Спасибо Hansatz за то, что он помог мне. С «parse by sighting» я имею в виду следующее: файл json содержит разные наблюдения за животными, каждый из которых начинается с «type: Feature» в json. Не все эти наблюдения содержат одну и ту же информацию, но я хочу получить доступные значения для каждого отдельного прицела, поместить это в строку и отправить ее в базу данных. Затем переходите к следующему прицелу и т. Д. Таким образом, я получаю запись базы данных для каждого отдельного прицела. Ваш код работает идеально для получения всех доступных значений (спасибо!), Но я получаю все сразу. Означает ли это объяснение? –

+0

Я обновил код, чтобы вернуть строчную версию json-данных. Это, вероятно, не совсем то, что вы хотите, но это может послужить отправной точкой для вас. – Ben

+0

спасибо @hansatz, это определенно послужило отправной точкой для меня! –

Смежные вопросы