从嵌套python字典导出csv

从嵌套python字典导出csv,python,csv,dictionary,Python,Csv,Dictionary,我有一本这样的字典: {u'results': [{u'bucket': u'Table', u'data': [{u'Geography_dst': u'PE', u'avg_bps': 5054970470.588235, u'device': u'taco', u'as': u'Telephone Company',

我有一本这样的字典:

{u'results': [{u'bucket': u'Table',
           u'data': [{u'Geography_dst': u'PE',
                      u'avg_bps': 5054970470.588235,
                      u'device': u'taco',
                      u'as': u'Telephone Company',
                      u'next_hop': u'Telephone Companu',
                      u'key': blah,
                      u'max_bps': 6613494000,
                      u'p95th_bps': 6280622000,
                      u'timeSeries': {}},
[为简洁起见被截断]

我似乎不知道如何将这本词典解析为csv。我很难弄清楚如何从“data”元组中的每个键生成一列,并从适当的值填充行:

 device,as,nexthop,Geography_dst,max_bps,p95th_bps,avg_bps
(是的,我不希望csv中有“key”或timeseries元组,但我想,一旦我弄清楚如何使用此数据结构,这一点就显而易见了)


谢谢

我假设您只想保存数据部分,并且它由多个具有相同键的字典组成。下面是可以转换和保存“数据”的代码

这将解决问题:

import csv

big_dict = {
    'reslts': [{
        'bcket': 'Table',
        'data': [{
            'Geography_dst': 'PE',
            'avg_bps': 5054970470.588235,
            'device': 'taco',
            'as': 'Telephone Company',
            'next_hop': 'Telephone Compan',
            'key': 'blah',
            'max_bps': 6613494000,
            'p95th_bps': 6280622000,
            'timeSeries': {}
        },
        {
            'avg_bps': 5054970470.588235,
            'device': 'taco',
            'as': 'Telephone Company',
            'next_hop': 'Telephone Compan',
            'key': 'blah',
            'p95th_bps': 6280622000,
            'timeSeries': {},
            'Geography_dst': 'XE',
            'max_bps': 6613494000
        }]
    }]
}

my_dicts = big_dict['reslts'][0]['data']

with open('mycsvfile.csv', 'w') as f:  # Just use 'w' mode in 3.x
    keys_saved = False
    for my_dict in my_dicts:
        w = csv.DictWriter(f, my_dict.keys())
        if not keys_saved:
            w.writeheader()
            keys_saved = True
        w.writerow(my_dict)
请注意,这可以处理到处都有相同密钥的情况,但不一定是以相同的顺序。

您可以使用它根据提供给构造函数的说明从
dict
写入字段:

import csv
COLUMNS = 'device,as,next_hop,Geography_dst,max_bps,p95th_bps,avg_bps'

d = {
    u'results': [{
        u'bucket': u'Table',
        u'data': [{
            u'Geography_dst': u'PE',
            u'avg_bps': 5054970470.588235,
            u'device': u'taco',
            u'as': u'Telephone Company',
            u'next_hop': u'Telephone Companu',
            u'key': None,
            u'max_bps': 6613494000,
            u'p95th_bps': 6280622000,
            u'timeSeries': {}
        }]
    }]
}

with open('output.csv', 'w') as f:
    writer = csv.DictWriter(f, extrasaction='ignore', fieldnames=COLUMNS.split(','))
    writer.writeheader()
    rows = (row for bucket in d['results'] for row in bucket['data'])
    writer.writerows(rows)
Output.csv中输出:

device,as,next_hop,Geography_dst,max_bps,p95th_bps,avg_bps
taco,Telephone Company,Telephone Companu,PE,6613494000,6280622000,5054970470.588235
在上面的
csv.DictWriter(f,extraction='ignore',fieldnames=COLUMNS.split(','))
创建一个writer对象
extrasaction
指示它跳过
字段名中不存在的键
fieldnames
是要从每个
dict
写入的键的有序列表。只需写入列名,如果不需要列,则可以跳过此操作


是一个生成器表达式,它迭代结果中的结果和对象。它会一个接一个地返回您要编写的dict。最后,生成器将把生成器返回的所有dict写入文件。

您只想将“数据”部分保存到一个文件中,而忽略上面的内容?是的,这是正确的。通常,dict中键的顺序是不可预测的,并且可以在每次运行程序时更改,因此您不应该传递
my_dict.keys()
至“csv.DictWriter”。相反,您应该传递一个固定的键列表。dict中键的顺序在每次运行时不是随机的,但是如果Python升级,它可能会改变。固定列表的替代方法:传递
sorted(my_dict.keys())
以固定顺序,或使用
collections.orderedict
以确保键始终按照创建顺序(由数据源定义)排列。