Bagaimana saya mengonversi daftar kamus ini menjadi file csv?

160

Saya memiliki daftar kamus yang terlihat seperti ini:

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

Apa yang harus saya lakukan untuk mengonversikan ini ke file csv yang terlihat seperti ini:

name,age,weight
bob,25,200
jim,31,180
backus
sumber
kemungkinan duplikat dari penulisan header dalam csv python dengan DictWriter
SilentGhost

Jawaban:

284
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)

EDIT: Solusi saya sebelumnya tidak menangani pesanan. Seperti dicatat oleh Wilduck, DictWriter lebih tepat di sini.

Matthew Flaschen
sumber
11
Perhatikan bahwa cara yang lebih pythonic untuk membuka (dan menutup) file adalahwith open('people.csv', 'wb') as f: ...
gozzilli
6
Anda dapat menggunakan dict_writer.writeheader()sebagai gantidict_writer.writer.writerow(keys)
megawac
8
Tidak berfungsi jika item daftar pertama tidak mengandung semua kunci
greg121
61
dalam Python 3 ituopen('people.csv', 'w')
Zev Averbach
3
set().union(*(d.keys() for d in mylist))untuk mendapatkan semua kunci dalam daftar (jika Anda memiliki beberapa yang tidak memiliki semua kunci.)
Julian Camilleri
17

ini adalah ketika Anda memiliki satu daftar kamus:

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'})
dipalu
sumber
17

Dalam python 3 hal-hal sedikit berbeda, tetapi cara yang lebih sederhana dan lebih rentan kesalahan. Sebaiknya beri tahu CSV file Anda harus dibuka dengan utf8penyandian, karena itu membuat data lebih portabel untuk orang lain (dengan asumsi Anda tidak menggunakan penyandian yang lebih ketat, seperti 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)
  • Perhatikan bahwa csvdalam python 3 memerlukan newline=''parameter, jika tidak, Anda mendapatkan baris kosong di CSV Anda saat membuka di excel / opencalc.

Atau: Saya lebih suka menggunakan handler csv di pandasmodul. Saya menemukan itu lebih toleran terhadap masalah penyandian, dan panda akan secara otomatis mengkonversi nomor string dalam CSV menjadi tipe yang benar (int, float, dll) ketika memuat file.

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

catatan:

  • panda akan mengurus membuka file untuk Anda jika Anda memberikan path, dan akan default ke utf8dalam python3, dan mencari tahu header juga.
  • kerangka data tidak sama dengan struktur yang diberikan CSV kepada Anda, jadi Anda menambahkan satu baris saat memuat untuk mendapatkan hal yang sama: dataframe.to_dict('records')
  • panda juga mempermudah kontrol urutan kolom dalam file csv Anda. Secara default, mereka abjad, tetapi Anda dapat menentukan urutan kolom. Dengan csvmodul vanilla , Anda perlu memberinya OrderedDictatau mereka akan muncul dalam urutan acak (jika bekerja dengan python <3.5). Lihat: Mempertahankan urutan kolom dalam Python Pandas DataFrame untuk lebih.
Marc Maxmeister
sumber
7

Karena @User dan @BiXiC meminta bantuan dengan UTF-8 di sini variasi solusi oleh @Matthew. (Saya tidak diizinkan berkomentar, jadi saya menjawab.)

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)
bunga bunga
sumber
2
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]])

Ini akan menjadi cara paling sederhana untuk menulis data ke file .csv

jitsm555
sumber
1

Berikut ini adalah solusi lain yang lebih umum dengan asumsi Anda tidak memiliki daftar baris (mungkin tidak sesuai dengan memori) atau salinan tajuk (mungkin write_csvfungsinya generik):

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)

Catatan : konstruktor OrderedDict yang digunakan di sini hanya menyimpan pesanan dengan python> 3.4. Jika pesanan penting, gunakan OrderedDict([('name', 'bob'),('age',25)])formulir.

eddygeek
sumber
tidak pernah melihat orang menyimpan data dalam generator sebelumnya - pendekatan yang menarik.
Marc Maxmeister
1
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)
Souvik Daw
sumber