Python:将嵌套字典编写为CSV

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)


Łuk*_*ski 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})
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)

  • 亲爱的 Python 3 用户,他们不想像我刚做的那样在这上面花费数小时,而您只需将 `open("test_output.csv", "wb")` 切换为 `open("test_output.csv", "wb")`。 csv", "w", newline='')` 和上述解决方案将完美无缺。否则,您将得到一个“需要类似字节的对象,而不是写入文件时的“str””。不要像我一样成为 nana 并尝试将整个字典编码为“ascii”。 (3认同)

mat*_*yce 5

改变:

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:]避免随机行为。