Как мне преобразовать этот список словарей в CSV-файл? - PullRequest
121 голосов
/ 21 июня 2010

У меня есть список словарей, который выглядит примерно так:

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

Что я должен сделать, чтобы преобразовать это в CSV-файл, который выглядит примерно так:

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

Ответы [ 6 ]

223 голосов
/ 21 июня 2010
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)

РЕДАКТИРОВАТЬ: мое предыдущее решение не обрабатывает заказ. Как отметил Уилдак, DictWriter здесь больше подходит.

13 голосов
/ 14 февраля 2015

это когда у вас есть один список словарей:

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'})
6 голосов
/ 26 февраля 2017

Поскольку @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)
3 голосов
/ 12 февраля 2019

В 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='', в противном случае вы получите пустые строки в CSV при открытии в excel / opencalc.

В качестве альтернативы: я предпочитаю использовать обработчик 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')
  • pandas также значительно облегчает управление порядком столбцов в вашем CSV-файле. По умолчанию они в алфавитном порядке, но вы можете указать порядок столбцов. С ванильным csv модулем вам нужно указать OrderedDict, иначе они появятся в случайном порядке (если работа в python <3.5). См .: <a href="https://stackoverflow.com/questions/15653688/preserving-column-order-in-python-pandas-dataframe"> Сохранение порядка столбцов в Python DataFrame Pandas для получения дополнительной информации.
0 голосов
/ 19 апреля 2018
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 file

0 голосов
/ 22 марта 2018

Вот еще одно, более общее решение, при условии, что у вас нет списка строк (возможно, они не помещаются в памяти) или копии заголовков (возможно, функция 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)]).

...