从嵌套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
以确保键始终按照创建顺序(由数据源定义)排列。