如何将这个字典列表转换为csv文件?

我有一个字典列表,看起来像这样:

toCSV = [{'name':'bob','age':25,'weight':200},{'name':'jim','age':31,'weight':180}]

我应该做什么来将它转换成一个csv文件,看起来像这样:

name,age,weight
bob,25,200
jim,31,180
217817 次浏览
import csv


to_csv = [
{'name': 'bob', 'age': 25, 'weight': 200},
{'name': 'jim', 'age': 31, 'weight': 180},
]


keys = to_csv[0].keys()


with open('people.csv', 'w', newline='') as output_file:
dict_writer = csv.DictWriter(output_file, keys)
dict_writer.writeheader()
dict_writer.writerows(to_csv)

这是当你有一个字典列表时:

import csv
with open('names.csv', 'w') as csvfile:
fieldnames = ['first_name', 'last_name']
writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
writer.writeheader()
writer.writerow({'first_name': 'Baked', 'last_name': 'Beans'})

因为@User和@BiXiC请求帮助使用UTF-8,这里是@Matthew的解决方案的变体。(我不能发表评论,所以我来回答。)

import unicodecsv as csv
toCSV = [{'name':'bob','age':25,'weight':200},
{'name':'jim','age':31,'weight':180}]
keys = toCSV[0].keys()
with open('people.csv', 'wb') as output_file:
dict_writer = csv.DictWriter(output_file, keys)
dict_writer.writeheader()
dict_writer.writerows(toCSV)

下面是另一个更通用的解决方案,假设你没有行列表(可能它们不适合内存)或头文件的副本(可能write_csv函数是通用的):

def gen_rows():
yield OrderedDict(name='bob', age=25, weight=200)
yield OrderedDict(name='jim', age=31, weight=180)


def write_csv():
it = genrows()
first_row = it.next()  # __next__ in py3
with open("people.csv", "w") as outfile:
wr = csv.DictWriter(outfile, fieldnames=list(first_row))
wr.writeheader()
wr.writerow(first_row)
wr.writerows(it)

请注意:这里使用的OrderedDict构造函数仅在python >3.4中保留顺序。如果顺序很重要,则使用OrderedDict([('name', 'bob'),('age',25)])形式。

import csv


with open('file_name.csv', 'w') as csv_file:
writer = csv.writer(csv_file)
writer.writerow(('colum1', 'colum2', 'colum3'))
for key, value in dictionary.items():
writer.writerow([key, value[0], value[1]])

这将是将数据写入. csv文件的最简单方法

在python 3中,事情有点不同,但更简单,更不容易出错。告诉CSV你的文件应该使用utf8编码打开,这是一个好主意,因为它使数据更容易移植到其他人(假设你没有使用更严格的编码,如latin1)

import csv
toCSV = [{'name':'bob','age':25,'weight':200},
{'name':'jim','age':31,'weight':180}]
with open('people.csv', 'w', encoding='utf8', newline='') as output_file:
fc = csv.DictWriter(output_file,
fieldnames=toCSV[0].keys(),


)
fc.writeheader()
fc.writerows(toCSV)
  • 注意,python3中的csv需要newline=''参数,否则在excel/opencalc中打开CSV时会得到空行。

或者:我更喜欢使用pandas模块中的csv处理程序。我发现它对编码问题更宽容,并且pandas在加载文件时会自动将csv中的字符串数字转换为正确的类型(int,float等)。 . c

import pandas
dataframe = pandas.read_csv(filepath)
list_of_dictionaries = dataframe.to_dict('records')
dataframe.to_csv(filepath)

注意:

  • 如果你给它一个路径,pandas会负责为你打开文件,并且在python3中默认为utf8,并且还会找出头文件。
  • dataframe与CSV提供给你的结构不同,所以你在加载时添加一行来获得相同的东西:dataframe.to_dict('records')
  • Pandas还可以更容易地控制CSV文件中的列的顺序。默认情况下,它们是按字母顺序排列的,但是您可以指定列的顺序。对于普通的csv模块,你需要给它提供一个OrderedDict,否则它们将以随机顺序出现(如果使用python <3.5)。更多信息请参见:在Python Pandas数据框架中保留列顺序
import csv
toCSV = [{'name':'bob','age':25,'weight':200},
{'name':'jim','age':31,'weight':180}]
header=['name','age','weight']
try:
with open('output'+str(date.today())+'.csv',mode='w',encoding='utf8',newline='') as output_to_csv:
dict_csv_writer = csv.DictWriter(output_to_csv, fieldnames=header,dialect='excel')
dict_csv_writer.writeheader()
dict_csv_writer.writerows(toCSV)
print('\nData exported to csv succesfully and sample data')
except IOError as io:
print('\n',io)

熊猫的短期解决方案

import pandas as pd


list_of_dicts = [
{'name': 'bob', 'age': 25, 'weight': 200},
{'name': 'jim', 'age': 31, 'weight': 180},
]


df = pd.DataFrame(list_of_dicts)
df.to_csv("names.csv", index=False)