我的字典看起来像这样:
{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'或时间序列元组,但是我知道一旦我弄清楚如何使用这个数据结构就会很明显。)
谢谢!
答案 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)
请注意,如果您在任何地方都使用相同的密钥,则处理此情况,但不一定按相同的顺序。