将Python字典写入CSV,其中keys = columns,values = rows
我有一个我希望能够在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”等。很抱歉,如果这是愚蠢的。
谢谢
csv模块有一个DictWriter类,这在另一个SO答案中被很好地覆盖了。 关键的一点是,当你实例化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()
我构build字段名的方式会扫描整个list_of_dicts
,所以随着大小的增加,它会变慢。 您应该直接从数据源创buildfieldnames
,例如,如果数据源也是csv文件,则可以使用DictReader并使用fieldnames = reader.fieldnames
。
您也可以用一个调用writer.writerows(list_of_dicts)
replacefor
循环,并使用with
block来处理文件closures,在这种情况下,您的代码将变成
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)
您需要编写两个单独的行,一个使用键,一个使用值,而不是:
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()])
这两个列表parsing首先提取所有键,然后从input列表中的字典中提取所有值,将这些键合并成一个列表以写入CSV文件。