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

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', 'wb') as output_file:
    dict_writer = csv.DictWriter(output_file, keys)
    dict_writer.writeheader()
    dict_writer.writerows(toCSV)

编辑:我的先前解决方案无法处理订单。正如Wilduck所指出的那样,在这里,Dicttriter更合适。

其他提示

这是您有一个字典列表的时候:

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)

在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 在Python 3中需要 newline='' 参数,否则在Excel/OpenCalc打开时,您会在CSV中获得空白行。

或者:我更喜欢在CSV处理程序中使用 pandas 模块。我发现它更容忍编码问题,并且 加载文件时,PANDAS将自动将CSV中的字符串号转换为正确的类型(INT,Float等)。

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

笔记:

  • 如果您给您一条路径,Pandas将为您打开文件,并默认为 utf8 在python3中,也弄清楚标题。
  • 数据帧与CSV的结构不同,因此您在加载时添加一行以获取相同的内容: dataframe.to_dict('records')
  • 熊猫还使控制CSV文件中的列顺序变得更加容易。默认情况下,它们是字母顺序的,但是您可以指定列顺序。与香草 csv 模块,您需要给它喂 OrderedDict 否则它们会以随机顺序出现(如果在Python <3.5中工作)。看: 在Python Pandas DataFrame中保存列顺序 更多。

这是另一个更通用的解决方案,假设您没有行列表(也许它们不适合内存)或标题的副本(也许是 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)

笔记: :此处使用的有序构造函数仅在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 文件

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top