Python:将嵌套字典编写为CSV

时间:2015-04-01 20:55:05

标签: 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]])

这会给我一个包含两列的表:第一列包含orgname;第二个包含[2,1,1](或子词典中的相应值)。我想要一个包含四列的表格:一列用于orgname,然后三列用于相应的列表元素。

5 个答案:

答案 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'])