我试图将嵌套字典写入.csv文件。这是一个简单的例子:
import csv
import itertools
fields = [ 'org', '2015', '2014', '2013' ]
dw = { 'orgname1': { '2015' : 2, '2014' : 1, '2013' : 1 },
'orgname2': { '2015' : 1, '2014' : 2, '2013' : 3 },
'orgname3': { '2015' : 1, '2014' : 3, '2013' : 1 }
}
with open("test_output.csv", "wb") as f:
w = csv.writer( f )
years = dw.values()[0].keys()
for key in dw.keys():
w.writerow([key, [dw[key][year] for year in years]])
这会给我一个包含两列的表:第一列包含orgname
;第二个包含[2,1,1](或子词典中的相应值)。我想要一个包含四列的表格:一列用于orgname
,然后三列用于相应的列表元素。
答案 0 :(得分:10)
这看起来像是DictWriter
的工作:
import csv
import itertools
import sys
fields = [ 'org', '2015', '2014', '2013' ]
dw = { 'orgname1': { '2015' : 2, '2014' : 1, '2013' : 1 },
'orgname2': { '2015' : 1, '2014' : 2, '2013' : 3 },
'orgname3': { '2015' : 1, '2014' : 3, '2013' : 1 }
}
w = csv.DictWriter( sys.stdout, fields )
for key,val in sorted(dw.items()):
row = {'org': key}
row.update(val)
w.writerow(row)
答案 1 :(得分:7)
使用DictWriter和标题
的替代实施import csv
import itertools
fields = [ 'org', '2015', '2014', '2013' ]
dw = { 'orgname1': { '2015' : 2, '2014' : 1, '2013' : 1 },
'orgname2': { '2015' : 1, '2014' : 2, '2013' : 3 },
'orgname3': { '2015' : 1, '2014' : 3, '2013' : 1 }
}
with open("test_output.csv", "wb") as f:
w = csv.DictWriter(f, fields)
w.writeheader()
for k in dw:
w.writerow({field: dw[k].get(field) or k for field in fields})
输出:
org,2015,2014,2013
orgname1,2,1,1
orgname3,1,3,1
orgname2,1,2,3
答案 2 :(得分:3)
变化:
w.writerow([key, [dw[key][year] for year in years]])
要:
w.writerow([key] + [dw[key][year] for year in years])
否则,您尝试将类似[orgname1, [2, 1, 1]]
的内容写入csv,而您的意思是[orgname1, 2, 1, 1]
。
正如Padraic所提到的,您可能希望将years = dw.values()[0].keys()
更改为years = sorted(dw.values()[0].keys())
或years = fields[1:]
以避免随机行为。
答案 3 :(得分:1)
使用DictWriter不需要事先对字段进行排序,因为w.writerow()
将确保正确的顺序。但是对项目本身进行排序确实有意义。
因此,综合以上所有建议并挑选最佳建议,我会想出以下代码:
import csv
import itertools
def mergedict(a,b):
a.update(b)
return a
fields = [ 'org', '2015', '2014', '2013' ]
dw = { 'orgname1': { '2015' : 2, '2014' : 1, '2013' : 1 },
'orgname2': { '2015' : 1, '2014' : 2, '2013' : 3 },
'orgname3': { '2015' : 1, '2014' : 3, '2013' : 1 }
}
with open("test_output.csv", "wb") as f:
w = csv.DictWriter( f, fields )
w.writeheader()
for k,d in sorted(dw.items()):
w.writerow(mergedict({'org': k},d))
我添加了一个很小的mergedict()
功能,使其成为一个更加向下的内线。
答案 4 :(得分:0)
我认为这可能是一种更简单的方法:
import csv
fields = [ 'org', '2015', '2014', '2013' ]
dw = { 'orgname1': { '2015' : 2, '2014' : 1, '2013' : 1 },
'orgname2': { '2015' : 1, '2014' : 2, '2013' : 3 },
'orgname3': { '2015' : 1, '2014' : 3, '2013' : 1 }
}
with open("test_output.csv", "w") as csv_file:
csvwriter = csv.writer(csv_file)
csvwriter.writerow(['org', '2015', '2014', '2013'])
for org in dw:
csvwriter.writerow(org, dw[org]['2015'], dw[org]['2014'], dw[org]['2013'])