Bagaimana saya mengonversi daftar kamus ini menjadi file csv?


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.


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

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.

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)

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


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.


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)
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.