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

271 投票
8 回答
257166 浏览
提问于 2025-04-16 00:15

我有一个字典列表,长得像这样:

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

我应该怎么做才能把它转换成一个看起来像这样的csv文件:

name,age,weight
bob,25,200
jim,31,180

8 个回答

19

这段话是在说你有一个字典列表的时候:

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'})
39

在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)
  • 需要注意的是,在Python 3中使用csv模块时,必须加上newline=''这个参数,否则在用Excel或OpenCalc打开CSV文件时,会出现空行。

另外,我更喜欢使用pandas模块中的CSV处理工具。我发现它对编码问题更宽容,而且当加载文件时,pandas会自动把CSV中的字符串数字转换成正确的类型(比如整数、浮点数等)。

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

注意:

  • 如果你给pandas一个文件路径,它会帮你打开文件,并且在Python 3中默认使用utf8编码,同时也会自动识别表头。
  • 数据框(dataframe)和CSV文件的结构不完全一样,所以在加载后你需要加一行代码来得到相同的内容:dataframe.to_dict('records')
  • pandas还让你更容易控制CSV文件中列的顺序。默认情况下,列是按字母顺序排列的,但你可以指定列的顺序。如果使用普通的csv模块,你需要提供一个OrderedDict,否则列的顺序会是随机的(如果你在Python 3.5之前工作)。想了解更多,可以查看这个链接:在Python Pandas数据框中保持列的顺序
474

在编程中,有时候我们会遇到一些问题,尤其是在使用某些工具或库的时候。比如,有人可能会在使用某个库时发现它的功能不太符合自己的需求,或者在使用过程中遇到了一些错误。这种情况下,通常可以通过查看文档、搜索相关问题或者在社区论坛上提问来找到解决办法。

另外,很多时候,其他开发者可能也遇到过类似的问题,他们会在像StackOverflow这样的地方分享他们的经验和解决方案。因此,查找这些资源是非常有帮助的,可以让我们更快地解决问题,提升自己的编程能力。

总之,遇到问题时,不要慌张,先尝试自己查找资料,看看有没有人遇到过类似的情况,通常都会找到一些有用的信息。

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)

撰写回答