通过嵌套的混合字典迭代

时间:2014-01-14 04:58:58

标签: python json dictionary

我一直在使用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。

1 个答案:

答案 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。