从嵌套的python字典导出csv

时间:2017-01-24 07:11:25

标签: 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'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'或时间序列元组,但是我知道一旦我弄清楚如何使用这个数据结构就会很明显。)

谢谢!

2 个答案:

答案 0 :(得分:1)

您可以使用csv.DictWriter根据给定构造函数的说明从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, extrasaction='ignore', fieldnames=COLUMNS.split(','))创建一个编写器对象。 extrasaction指示其跳过fieldnames中不存在的密钥。 fieldnames是您要从每个dict写入的有序键列表。 writeheader只是写了列名,如果不需要列,可以跳过这个。

rows是一个生成器表达式,它迭代结果中的结果和对象。它会逐一返回您要写的字符串。最后,生成器被赋予writerows,它将生成器返回的所有dicts写入文件。

答案 1 :(得分:0)

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

这样可以解决问题:

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)

请注意,如果您在任何地方都使用相同的密钥,则处理此情况,但不一定按相同的顺序。