我尝试将查询的开源数据(here, for reference)转换为csv。我可以使用requests
包访问和查询数据,如下所示:
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)
这会写入数据,但是最后一列'位置'本身就是一个字典,包含" type"和"坐标" (例如:"{u'type': u'Point', u'coordinates': [-87.711766, 41.880909]}"
)。我只想要'坐标'数据,如果存在。
我怎样才能只编写'坐标'如果数据存在,此列的部分到输出文件?修改field_names
以包含'location'[1]
或'location'['coordinates']
似乎无效。
答案 0 :(得分:2)
如果您的行有位置数据,请将其转换为您想要的格式:
for row in data:
if 'location' in row:
row['location'] = row['location']['coordinates']
output.writerow(row)