需要在python中生成csv输出,如下所示

时间:2018-05-14 14:34:10

标签: python csv

import csv
d={'a':[1,3,4],'b':[2,3,4],'c':[1]}
with open("result.csv","w") as csv_file:
   csv_writer = csv.writer(csv_file,dialect='excel')

   csv_writer.writerows(d.items())

需要获得如下输出:

a   1
    3
    4
b   2
    3
    4
c   1

2 个答案:

答案 0 :(得分:1)

您需要迭代输入字典;你现在没有输入行。

对于输入词典中的每个键值对,您有多行。第一行包含键和第一个值,然后第一行包含剩余值的更多行,第一列为空。

您需要明确地写下这些行:

csv_writer = csv.writer(csv_file, dialect='excel')
for key, values in d.items():
    csv_writer.writerow((key, values[0]))
    csv_writer.writerows([(None, value) for value in values[1:]])

我使用None作为空列值,导致输出中出现空列:

>>> import csv
>>> from io import StringIO
>>> output = StringIO()
>>> d = {'a': [1, 3, 4], 'b': [2, 3, 4], 'c': [1]}
>>> csv_writer = csv.writer(output, dialect='excel')
>>> for key, values in d.items():
...     csv_writer.writerow((key, values[0]))
...     csv_writer.writerows([(None, value) for value in values[1:]])
...
5
5
5
>>> print(output.getvalue())
a,1
,3
,4
b,2
,3
,4
c,1 

您可能希望向sorted()循环添加d.items()次调用;否则你的输出将按照字典顺序,arbitrary based on insertion and deletion history,至少在Python 3.6之前。

答案 1 :(得分:1)

首先你需要对键进行排序以得到a,b,c ......(在python 3.6之前,dicts不会被排序)

然后你必须发出元组,而不是原始的dicts。我建议使用带有空填充值的itertools.zip_longest来交换密钥和密钥。价值观一起:

import csv,itertools
d={'a':[1,3,4],'b':[2,3,4],'c':[1]}
with open("result.csv","w",newline="") as csv_file:
    csv_writer = csv.writer(csv_file,dialect='excel',delimiter=",") # or ";"
    for k,v in sorted(d.items()):
        csv_writer.writerows(itertools.zip_longest([k],v,fillvalue=""))

创建以下原始格式:

a,1
,3
,4
b,2
,3
,4
c,1

如果您需要合并的单元格,只需使用换行符连接整数值:

csv_writer.writerows([k,"\n".join(map(str,v))] for k,v in sorted(d.items()))

输出:

a,"1
3
4"
b,"2
3
4"
c,1
excel中的

(您可能希望将分隔符更改为“;”,具体取决于版本)

enter image description here