我一直在使用CrunchBase API,提供的输出如下例所示(实际示例here):
output = {'name':'StackOverflow',
'competitors':[{ 'competitor':'bing',
'link':'bing.com'},
{ 'competitor':'google',
'link':'google.com'}],
'acquisition': {'acquired_day': 16,
'acquired_month': 12,
'acquired_year': 2013,
'acquiring_company': {'name': 'Viggle',
'permalink': 'viggle'}}}
(这只是一个例子)。
关键是,在输出dict中有几个值可以是unicode / int,列表或字典。值也可以包含列表,字典或unicode。
我怎么能遍历dict?我试过itertools.product但它似乎只在dict的结构是统一的时候起作用。我的目标是将此输出JSON文件转换为csv。
答案 0 :(得分:3)
我不完全确定您希望实现的目标,但如果您的output
实际上是请求的CSV中的一行,则可能需要先“展平”嵌套词典。
假设你的结构是一个dict,其值是“简单”(字符串,浮点数等),或dicts,或列表(嵌套,无限深度),并假设有一些字符(例如,“_”)如果没有出现在任何键中,您可以使用以下递归函数(或任何其他类似的函数)来展平dict:
def _flatten_items(items, sep, prefix):
_items = []
for key, value in items:
_prefix = "{}{}".format(prefix, key)
if isinstance(value, list):
_items.extend(_flatten_items(list(enumerate(value)), sep=sep,
prefix=_prefix+sep))
elif isinstance(value, dict):
_items.extend(_flatten_items(value.items(), sep=sep,
prefix=_prefix+sep))
else:
_items.append((_prefix, value))
return _items
def flatten_dict(d, sep='_'):
return dict(_flatten_items(d.items(), sep=sep, prefix=""))
例如,在您的output
中,这应该给出:
output = {'name':'StackOverflow',
'competitors':[{ 'competitor':'bing',
'link':'bing.com'},
{ 'competitor':'google',
'link':'google.com'}],
'acquisition': {'acquired_day': 16,
'acquired_month': 12,
'acquired_year': 2013,
'acquiring_company': {'name': 'Viggle',
'permalink': 'viggle'}}}
print flatten_dict(output)
# {'acquisition_acquired_year': 2013, 'acquisition_acquiring_company_name': 'Viggle', 'name': 'StackOverflow', 'acquisition_acquiring_company_permalink': 'viggle', 'competitors_0_competitor': 'bing', 'acquisition_acquired_month': 12, 'competitors_1_link': 'google.com', 'acquisition_acquired_day': 16, 'competitors_1_competitor': 'google', 'competitors_0_link': 'bing.com'}
然后您可以使用csv DictWriter
(或类似的)将输出数据写入csv。