この辞書のリストをcsvファイルに変換するにはどうすればよいですか?


回答:


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)

編集:私の以前のソリューションは注文を処理しません。Wilduckが述べたように、ここではDictWriterがより適切です。


11
開口部(およびクローズ)ファイルのより多くの神託の方法があることに注意してくださいwith open('people.csv', 'wb') as f: ...
gozzilli

6
dict_writer.writeheader()代わりに使用できますdict_writer.writer.writerow(keys)
megawac 14年

8
最初のリストアイテムにすべてのキーが含まれていない場合は機能しません
greg121

61
Pythonの3でそれはだopen('people.csv', 'w')
ZEV Averbach

3
set().union(*(d.keys() for d in mylist))リスト内のすべてのキーを取得するには(すべてのキーを持たないキーがある場合)
Julian Camilleri 2018年

17

これは、1つの辞書リストがある場合です。

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

Python 3では、状況は少し異なりますが、方法がシンプルになり、エラーが発生しにくくなります。utf8データを他の人に移植しやすくするため、ファイルをエンコーディングで開く必要があることをCSVに伝えることをお勧めします(などのより制限的なエンコーディングを使用していない場合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)
  • csvPython 3ではnewline=''パラメーターが必要であることに注意してください。そうでない場合、Excelまたはopencalcで開くと、CSVに空白行が表示されます。

あるいは、pandasモジュールのcsvハンドラーを使用することを好みます。エンコーディングの問題に対して寛容であることがわかりました。パンダは、ファイルをロードするときに、CSV内の文字列番号を自動的に正しいタイプ(int、floatなど)に変換します。

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

注意:

  • パスを指定すると、パンダがファイルを開いてくれます。デフォルトutf8でpython3になり、ヘッダーもわかります。
  • データフレームはCSVが提供するものと同じ構造ではないため、ロード時に1行追加して同じものを取得します。 dataframe.to_dict('records')
  • また、パンダを使用すると、csvファイルの列の順序を簡単に制御できます。デフォルトではアルファベット順ですが、列の順序を指定できます。バニラcsvモジュールでは、フィードする必要があります。そうしないとOrderedDict、ランダムな順序で表示されます(Python 3.5未満で動作している場合)。詳しくは、Python Pandas DataFrameでの列の順序の保持をご覧ください。

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)

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

これは、.csvファイルにデータを書き込む最も簡単な方法です。


1

以下は、行のリスト(メモリに収まらない可能性がある)またはヘッダーのコピー(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)])フォームを使用してください。


誰もがジェネレーターにデータを保存するのを見たことがない-興味深いアプローチ。
マークマックスマイスター

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)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.