Zac*_*ack 11 python csv dictionary
我正在尝试将嵌套字典写入.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]])
Run Code Online (Sandbox Code Playgroud)
这让我得到一个包含两列的表:第一列包含orgname
; 第二个包含[2,1,1](或子词典中的相应值).我想要一个有四列的表:一个用于orgname
,然后三个用于相应的列表元素.
Rob*_*obᵩ 11
这看起来像是一份工作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)
Run Code Online (Sandbox Code Playgroud)
使用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})
Run Code Online (Sandbox Code Playgroud)
输出:
org,2015,2014,2013
orgname1,2,1,1
orgname3,1,3,1
orgname2,1,2,3
Run Code Online (Sandbox Code Playgroud)
改变:
w.writerow([key, [dw[key][year] for year in years]])
Run Code Online (Sandbox Code Playgroud)
到:
w.writerow([key] + [dw[key][year] for year in years])
Run Code Online (Sandbox Code Playgroud)
否则,您会尝试向[orgname1, [2, 1, 1]]
csv写入类似内容,而您的意思是[orgname1, 2, 1, 1]
.
随着帕德里克提到的,您可能要更改years = dw.values()[0].keys()
到years = sorted(dw.values()[0].keys())
或years = fields[1:]
避免随机行为。
归档时间: |
|
查看次数: |
15543 次 |
最近记录: |