2017-02-20 14 views
0

Я пытаюсь преобразовать запрошенные данные с открытым исходным кодом (here, for reference) в csv. Я в состоянии получить доступ и запрашивать данные, используя requests пакет следующим образом:Преобразование JSON в CSV в Python, обработка словаря внутри экспортируемого поля

import requests 
import gzip 
import csv 

url = "https://data.cityofchicago.org/resource/6zsd-86xi.json" 
response = requests.get(url) 
print response.status_code 
if response.status_code == 200: 
    print "Connection successful. Decoding JSON" 
    data = response.json() 

Каждая строка данных имеет до 22 столбцов, которые могут или не могут присутствовать. Если данных для столбца нет, то пара JSON не будет присутствовать, вызывая KeyErrors. Для того, чтобы попытаться исправить это, я использую csv.DictWriter класс с field_names и restval=None параметра:

field_names = ['id', 
       'case_number', 
       'date', 
       'block', 
       'iucr', 
       'primary_type', 
       'description', 
       'location_description', 
       'arrest', 
       'domestic', 
       'beat', 
       'district', 
       'ward', 
       'community_area', 
       'fbi_code', 
       'x_coordinate', 
       'y_coordinate', 
       'year', 
       'updated_on', 
       'latitude', 
       'longitude', 
       'location' 
       ] 

file_name = 'open_data_test.csv.gz' 
local_file = gzip.open('/tmp/' + file_name, "wb") 

output = csv.DictWriter(local_file, 
        fieldnames=field_names, 
        restval=None, 
        extrasaction='ignore', 
        delimiter='|', 
        quoting=csv.QUOTE_ALL, 
        quotechar='"', 
        doublequote=True, 
        lineterminator='\n') 

for row in data: 
    output.writerow(row) 

Это записывает данные, однако последний столбец «расположение» само по себе является словарь, содержащий «тип» и «координаты "(например: "{u'type': u'Point', u'coordinates': [-87.711766, 41.880909]}"). Мне нужны только данные «координат», если они существуют.

Как я могу написать раздел «координаты» этого столбца в выходной файл, если данные присутствуют? Редактирование field_names для включения 'location'[1] или 'location'['coordinates'] не работает.

+0

Как насчет перекручивание через ваши 'dict.keys()' и если coordinates'' клавишу '==», а затем писать только ' dict ['координат'] '? –

+1

'if 'location' в строке: строка ['location'] = строка ['location'] ['координат']' –

ответ

2

Если строка имеет данные о местоположении преобразовать его в нужный формат:

for row in data: 
    if 'location' in row: 
     row['location'] = row['location']['coordinates'] 
    output.writerow(row)