[英]How do I convert this list of dictionaries to a csv file?
我有一个看起来像这样的字典列表:
toCSV = [{'name':'bob','age':25,'weight':200},{'name':'jim','age':31,'weight':180}]
我应该怎么做才能将其转换为如下所示的 csv 文件:
name,age,weight
bob,25,200
jim,31,180
import csv
toCSV = [{'name':'bob','age':25,'weight':200},
{'name':'jim','age':31,'weight':180}]
keys = toCSV[0].keys()
with open('people.csv', 'w', newline='') as output_file:
dict_writer = csv.DictWriter(output_file, keys)
dict_writer.writeheader()
dict_writer.writerows(toCSV)
在 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)
csv
需要newline=''
参数,否则在 excel/opencalc 中打开时,您的 CSV 中会出现空行。 或者:我更喜欢使用pandas
模块中的 csv 处理程序。 我发现它更能容忍编码问题,当加载文件时, pandas 会自动将 CSV 中的字符串数字转换为正确的类型(int、float 等)。
import pandas
dataframe = pandas.read_csv(filepath)
list_of_dictionaries = dataframe.to_dict('records')
dataframe.to_csv(filepath)
笔记:
utf8
,并找出标题。dataframe.to_dict('records')
csv
模块,您需要为其提供OrderedDict
否则它们将以随机顺序出现(如果在 python < 3.5 中工作)。 有关更多信息,请参阅: 在 Python Pandas DataFrame 中保留列顺序。这是当你有一个字典列表时:
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文件的最简单方法
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)
Pandas 的简短解决方案
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)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.