将Python字典写入CSV,其中keys = columns,values = rows

时间:2012-12-01 14:09:49

标签: python excel csv dictionary

我有一个字典列表,我希望能够在Excel中打开,格式正确。这是我到目前为止使用csv:

list_of_dicts = [{'hello': 'goodbye'}, {'yes': 'no'}]
out_path= "/docs/outfile.txt"
out_file = open(ipath, 'wb')

writer = csv.writer(ofile, dialect = 'excel')

for items in list_of_dicts:
    for k,v in items.items():
        writer.writerow([k,v])

显然,当我在Excel中打开输出时,它的格式如下:

key  value
key  value

我想要的是:

key   key   key

value value value

我无法弄清楚如何做到这一点,所以请帮助我们。此外,我希望列名称是字典键,而不是默认的'A,B,C'等。抱歉,如果这是愚蠢的。

由于

3 个答案:

答案 0 :(得分:6)

csv模块有一个DictWriter类,在another SO answer中有很好的涵盖。关键点在于,在实例化DictWriter时需要知道所有列标题。您可以从list_of_dicts构建字段名称列表,如果是,则代码变为

list_of_dicts = [{'hello': 'goodbye'}, {'yes': 'no'}]
out_path= "/docs/outfile.txt"
out_file = open(out_path, 'wb')

fieldnames = sorted(list(set(k for d in list_of_dicts for k in d)))
writer = csv.DictWriter(out_file, fieldnames=fieldnames, dialect='excel')

writer.writeheader() # Assumes Python >= 2.7
for row in list_of_dicts:
    writer.writerow(row)
out_file.close()

我构建字段名的方式会扫描整个list_of_dicts,因此随着大小的增加它会减慢。您应该直接从数据来源构建fieldnames,例如如果您的数据源也是csv文件,您可以使用DictReader并使用fieldnames = reader.fieldnames

您也可以通过一次调用for替换writer.writerows(list_of_dicts)循环并使用with块来处理文件关闭,在这种情况下您的代码将成为

list_of_dicts = [{'hello': 'goodbye'}, {'yes': 'no'}]
out_path= "/docs/outfile.txt"

fieldnames = sorted(list(set(k for d in list_of_dicts for k in d)))

with open(out_path, 'wb') as out_file:
    writer = csv.DictWriter(out_file, fieldnames=fieldnames, dialect='excel')
    writer.writeheader()
    writer.writerows(list_of_dicts)

答案 1 :(得分:2)

您需要编写2个单独的行,一个包含键,另一个包含值,而不是:

writer = csv.writer(ofile, dialect = 'excel')

writer.writerow([k for d in list_of_dicts k in d])
writer.writerow([v for d in list_of_dicts v in d.itervalues()])

两个列表推导首先从输入列表中的词典中提取所有键,然后是所有值,将这些键组合成一个列表以写入CSV文件。

答案 2 :(得分:0)

我认为最有用的是逐列编写,因此每个键都是一列(对以后进行数据处理和用于ML很有用)。

昨天遇到了一些麻烦,但我想出了在其他网站上看到的解决方案。但是,从我看来,不可能一次浏览整个字典,我们必须将其分成较小的字典(我的csv文件最后有2万行-被调查者,他们的数据和答案。我这样做是喜欢的这个:

    # writing dict to csv
    # 'cleaned' is a name of the output file 
    
    # 1 header 
    # fildnames is going to be columns names 
    
    # 2 create writer 
    writer = csv.DictWriter(cleaned, d.keys())
    
    # 3 attach header 
    writer.writeheader()
    
    # write separate dictionarties 
    for i in range(len(list(d.values())[0])):
        
        writer.writerow({key:d[key][i] for key in d.keys()}) 

我看到我的解决方案还有一个for循环,但是另一方面,我认为它占用的内存更少(但是,我不确定!!) 希望对别人有帮助;)