用Python将字典列表写入CSV文件

3

我是一个新手Python程序员,正在努力将一个字典列表保存到CSV文件中。

我想要使用竖线字符作为分隔符将我的列表写入CSV文件中。

我的列表如下:

[{'COAST': {'Max_Load': 18779, 'Month': 8, 'Day': 13, 'Hour': 17, 'Year': 2013}}, 
 {'EAST': {'Max_Load': 2380, 'Month': 8, 'Day': 5, 'Hour': 17, 'Year': 2013}}, 
 {'FAR_WEST': {'Max_Load': 2281, 'Month': 6, 'Day': 26, 'Hour': 17, 'Year': 2013}}, 
 {'NORTH': {'Max_Load': 1544, 'Month': 8, 'Day': 7, 'Hour': 17, 'Year': 2013}}, 
 {'NORTH_C': {'Max_Load': 24415, 'Month': 8, 'Day': 7, 'Hour': 18, 'Year': 2013}}, 
 {'SOUTHERN': {'Max_Load': 5494.157645, 'Month': 8, 'Day': 8, 'Hour': 16, 'Year': 2013}}, 
 {'SOUTH_C': {'Max_Load': 11433, 'Month': 8, 'Day': 8, 'Hour': 18, 'Year': 2013}}, 
 {'WEST': {'Max_Load': 1862, 'Month': 8, 'Day': 7, 'Hour': 17, 'Year': 2013}}, 
 {'ERCOT': {'Max_Load': 67595, 'Month': 8, 'Day': 7, 'Hour': 17, 'Year': 2013}}]

我的最终csv应该是这样的:
Station|Year|Month|Day|Hour|Max Load COAST|2013|01|01|10|12345 EAST|2013|01|01|10|12345 FAR_WEST|2013|01|01|10|12345 NORTH|2013|01|01|10|12345 NORTH_C|2013|01|01|10|12345 SOUTHERN|2013|01|01|10|12345 SOUTH_C|2013|01|01|10|12345 WEST|2013|01|01|10|12345
我正在尝试编写一个名为save_file的函数,将列表保存在像上面那样的csv文件中,但我卡在了如何获取字典键并将它们写入行('COAST')和列('Year','Month','Date','Hour','Max Load')中。
def save_file(data, filename):
for i in range(len(data)):
    for k,v in data[i].items():
        print k
        for k1,v1 in v.items():
            print k1,v1


with open(filename,'wb') as f:
    fieldnames = ["Station","Year", "Month", "Date", "Hour", "Max Load"]
    wr = csv.writer(f, delimiter="|", fieldnames = fieldnames)
    wr.writeheader()

非常感谢您的任何帮助。

2个回答

3
您可以使用 csv.DictWriter 将字典写入 csv 文件中:
list_of_dict=[{'COAST': {'Max_Load': 18779, 'Month': 8, 'Day': 13, 'Hour': 17, 'Year': 2013}}, 
 {'EAST': {'Max_Load': 2380, 'Month': 8, 'Day': 5, 'Hour': 17, 'Year': 2013}}, 
 {'FAR_WEST': {'Max_Load': 2281, 'Month': 6, 'Day': 26, 'Hour': 17, 'Year': 2013}}, 
 {'NORTH': {'Max_Load': 1544, 'Month': 8, 'Day': 7, 'Hour': 17, 'Year': 2013}}, 
 {'NORTH_C': {'Max_Load': 24415, 'Month': 8, 'Day': 7, 'Hour': 18, 'Year': 2013}}, 
 {'SOUTHERN': {'Max_Load': 5494.157645, 'Month': 8, 'Day': 8, 'Hour': 16, 'Year': 2013}}, 
 {'SOUTH_C': {'Max_Load': 11433, 'Month': 8, 'Day': 8, 'Hour': 18, 'Year': 2013}}, 
 {'WEST': {'Max_Load': 1862, 'Month': 8, 'Day': 7, 'Hour': 17, 'Year': 2013}}, 
 {'ERCOT': {'Max_Load': 67595, 'Month': 8, 'Day': 7, 'Hour': 17, 'Year': 2013}}]

import csv

with open('names.csv', 'w') as csvfile:
    fieldnames = ('Station','Year', 'Month', 'Day', 'Hour', 'Max_Load')
    writer = csv.DictWriter(csvfile, fieldnames=fieldnames,delimiter='|')
    writer.writeheader()
    for d in list_of_dict:
          k,v=d.items()[0]
          v['Station']=k
          writer.writerow(v)

我感谢你的帮助。 - Duc Vu
当我运行你的代码时,出现了错误 ** line 148, in _dict_to_list + ", ".join([repr(x) for x in wrong_fields])) ValueError: dict contains fields not in fieldnames: 'COAST'**,我不确定我是否理解了'd['Station']'。'Station'是列表中的键还是字段名?感谢你的帮助。 - Duc Vu
你把你的字典放在 list_of_dict 里了吗? - Mazdak

2
Here you go:

lst=...

subkeys=["Year","Month","Day","Hour","Max_Load"]
with open("test.csv", "w") as f:
    f.write("Station|Year|Month|Day|Hour|Max Load\n\n")
    for elem in lst:
        for key in elem.keys():
            f.write(key)
            f.write("|")
            for k, subkey in enumerate(subkeys):
                f.write(str(elem[key][subkey]))
                if k < len(subkeys)-1: f.write("|")
            f.write("\n\n")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接