编写具有多个值的字典,以将数据存储在CSV文件的列中

时间:2018-04-27 15:16:08

标签: python csv dictionary

我正在尝试将以下字典写入csv文件:

reset done successfully
limits set to value  : <Old Non zero value>
Values for owner <owner> has not been reset, so retrying !

我想要实现的结果是将字典键作为列标题是csv文件并将相应的键值映射到这些列:

mydict = {'k1':[1,2,3], 'k2':[4,5,6], 'k3':[6,7,8]}

我尝试过以下代码,但这对我不起作用:

k1 k2 k3
1 4 6
2 5 7
3 6 8

3 个答案:

答案 0 :(得分:3)

如果您不反对pandas,这很容易:

import pandas as pd
pd.DataFrame(mydict).to_csv('filename.csv',index=None, sep=' ')

注意,sep=' '是将它作为空格分隔的csv。您可以省略(或使用sep=',',这是默认值)将其作为常规逗号分隔的csv

答案 1 :(得分:1)

我修改了你的函数,因此它不使用通常应该尽可能避免的全局变量。这里的“技巧”是使用内置的zip()函数来转置字典中的值,使它们处于列专业而不是行主要顺序。

为了更好地理解下面代码中发生的情况,首先要考虑dictionary.values()调用是否从您问题中字典中显示的示例数据生成以下序列:

[1, 2, 3], [4, 5, 6], [6, 7, 8]

通过使用以下简写的Python表示法(注意zip()前缀),所有这些都一次性地传递给*函数:

zip(*dictionary.values())

这相当于这样称呼:

zip([1, 2, 3], [4, 5, 6], [6, 7, 8])

因此zip()函数会重新排列它们,从而产生这个序列:

(1, 4, 6), (2, 5, 7), (3, 6, 8)

另一种思考方式是将值视为二维矩阵:

1, 2, 3
4, 5, 6
6, 7, 8

zip()正在对他们进行处理:

1, 4, 6
2, 5, 7
3, 6, 8

换句话说,它正在交换矩阵的行和列,这被称为“转置”矩阵。正如我所说的那样,在这里完成将它们放入将行列值逐行写入csv文件所需的顺序。

无论如何,这是代码:

import csv

def save_output(dictionary, output_file_name):
    with open(output_file_name, 'w', newline='') as csvfile:
        writer = csv.writer(csvfile)
        writer.writerow(dictionary)  # First row (the keys of the dictionary).
        for values in zip(*dictionary.values()):
            writer.writerow(values)

mydict = {'k1': [1, 2, 3], 'k2': [4, 5, 6], 'k3': [6, 7, 8]}

save_output(mydict, 'test_output.csv')

生成的test_output.csv文件的内容:

k1,k2,k3
1,4,6
2,5,7
3,6,8

答案 2 :(得分:0)

您可以尝试以下方法:

import csv

def save_output(mydict, output_file_name):
    keys = [list(mydict.keys())]
    values = [mydict[key] for key in mydict.keys()]
    final = keys + values
    with open(output_file_name, 'w', newline='') as csvfile:
        writer = csv.writer(csvfile, delimiter=' ')
        writer.writerows(final)

mydict = {'k1':[1,2,3], 'k2':[4,5,6], 'k3':[6,7,8]}

save_output(mydict, "output_file_name.csv")

打开csv文件时的输出是:

k1 k2 k3
1 2 3
4 5 6
6 7 8