如何将此词典列表转换为csv文件?

Bac*_*kus 136 python csv dictionary data-conversion

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

toCSV = [{'name':'bob','age':25,'weight':200},{'name':'jim','age':31,'weight':180}]
Run Code Online (Sandbox Code Playgroud)

我应该怎么做才能将其转换为如下所示的csv文件:

name,age,weight
bob,25,200
jim,31,180
Run Code Online (Sandbox Code Playgroud)

Mat*_*hen 249

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)
Run Code Online (Sandbox Code Playgroud)

编辑:我以前的解决方案不处理订单.正如Wilduck所说,DictWriter在这里更合适.

  • 在Python 3中,它是`open('people.csv','w')` (47认同)
  • 请注意,打开(和关闭)文件的更多pythonic方式是`open('people.csv','wb')为f:...` (10认同)
  • 这适用于ASCII,但UTF-8怎么样? (9认同)
  • 如果第一个列表项不包含所有键,则不起作用 (8认同)
  • `set().union(*(d.keys() for d in mylist))` 获取列表中的所有键(如果你有一些没有所有键的键。) (8认同)
  • 您可以使用`dict_writer.writeheader()`而不是`dict_writer.writer.writerow(keys)` (6认同)

ham*_*med 15

这是你有一个字典列表:

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'})
Run Code Online (Sandbox Code Playgroud)


Ali*_*asi 9

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)
Run Code Online (Sandbox Code Playgroud)


flo*_*wer 7

因为@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)
Run Code Online (Sandbox Code Playgroud)


Mar*_*ter 7

在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)
Run Code Online (Sandbox Code Playgroud)
  • 请注意,csv在python 3中需要该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)
Run Code Online (Sandbox Code Playgroud)

注意:

  • 如果您给它一个路径,pandas会为您打开文件,并且默认为utf8python3中的名称,并找出头文件。
  • 数据框的结构与CSV所提供的结构不同,因此在加载时添加一行即可得到相同的结果: dataframe.to_dict('records')
  • 熊猫还使控制csv文件中列的顺序变得容易得多。默认情况下,它们是字母顺序的,但是您可以指定列顺序。使用香草csv模块,您需要将其喂入,OrderedDict否则它们将以随机顺序出现(如果在python <3.5中工作)。有关更多信息,请参见:在Python Pandas DataFrame中保留列顺序

  • list_of_dictionaries 如何写入 CSV?我无法理解第二个代码示例。 (4认同)
  • 您的第二个代码示例似乎没有回答OP的问题。难道不应该在某个地方使用“from_dict”吗?我遇到了同样的问题,这对我有用。了解 to_dict 是件好事,但它似乎与阅读更相关,而不是与写作相关。 (3认同)