2017-02-20 69 views
0

我試圖將查詢的開源數據(here, for reference)轉換爲csv。我能使用requests包如下訪問和查詢數據:在Python中將JSON轉換爲CSV,處理導出字段內的字典

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_namesrestval=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 ['coordinates']'? –

+1

'if'location'in row:row ['location'] = row ['location'] ['coordinates']' –

回答

2

如果行有位置數據,將其轉換爲你想要的格式:

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