我有一个字典列表,看起来像这样:
toCSV = [{'name':'bob','age':25,'weight':200},{'name':'jim','age':31,'weight':180}]
我应该做什么来转换成一个csv文件,看起来像这样:
name,age,weight bob,25,200 jim,31,180
iklwldmw1#
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)
acruukt92#
在python 3中,情况稍有不同,但更简单,更不容易出错。告诉CSV你的文件应该用utf8编码打开是个好主意,因为这会使数据更容易被其他人移植(假设你没有使用更严格的编码,比如latin1)
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=''
或者:我更喜欢使用pandas模块中的csv处理程序。我发现它更能容忍编码问题,而且Pandas会在加载文件时自动将CSV中的字符串数字转换为正确的类型(int、float等)。
pandas
import pandas dataframe = pandas.read_csv(filepath) list_of_dictionaries = dataframe.to_dict('records') dataframe.to_csv(filepath)
注意事项:
dataframe.to_dict('records')
OrderedDict
vyu0f0g13#
这时您只有一个字典列表:
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'})
ntjbwcob4#
因为@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)
utugiqy65#
下面是另一个更通用的解决方案,假设您没有行的列表(可能它们不适合内存)或头文件的副本(可能write_csv函数是通用的):
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([('name', 'bob'),('age',25)])
l5tcr1uw6#
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**文件的最简单方法
lf5gs5x27#
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)
jdgnovmf8#
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)
8条答案
按热度按时间iklwldmw1#
acruukt92#
在python 3中,情况稍有不同,但更简单,更不容易出错。告诉CSV你的文件应该用
utf8
编码打开是个好主意,因为这会使数据更容易被其他人移植(假设你没有使用更严格的编码,比如latin1
)csv
需要newline=''
参数,否则在excel/opencalc中打开时,CSV中会出现空行。或者:我更喜欢使用
pandas
模块中的csv处理程序。我发现它更能容忍编码问题,而且Pandas会在加载文件时自动将CSV中的字符串数字转换为正确的类型(int、float等)。注意事项:
utf8
,并且也会弄清楚文件头。dataframe.to_dict('records')
csv
模块,你需要给它一个OrderedDict
,否则它们将以随机顺序出现(如果在python 3.5以下的版本中工作)。请参见:Preserving column order in Python Pandas DataFrame以获取更多信息。vyu0f0g13#
这时您只有一个字典列表:
ntjbwcob4#
因为@User和@BiXiC在这里寻求UTF-8的帮助,这是@Matthew解决方案的变体。(我不允许发表评论,所以我在回答。)
utugiqy65#
下面是另一个更通用的解决方案,假设您没有行的列表(可能它们不适合内存)或头文件的副本(可能
write_csv
函数是通用的):OrderedDict([('name', 'bob'),('age',25)])
形式。l5tcr1uw6#
这是将数据写入**.csv**文件的最简单方法
lf5gs5x27#
jdgnovmf8#
Pandas的一个简短解决方案