回答:
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がより適切です。
with open('people.csv', 'wb') as f: ...
dict_writer.writeheader()
代わりに使用できますdict_writer.writer.writerow(keys)
open('people.csv', 'w')
set().union(*(d.keys() for d in mylist))
リスト内のすべてのキーを取得するには(すべてのキーを持たないキーがある場合)
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)
csv
Python 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になり、ヘッダーもわかります。dataframe.to_dict('records')
csv
モジュールでは、フィードする必要があります。そうしないとOrderedDict
、ランダムな順序で表示されます(Python 3.5未満で動作している場合)。詳しくは、Python Pandas DataFrameでの列の順序の保持をご覧ください。@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)
以下は、行のリスト(メモリに収まらない可能性がある)またはヘッダーのコピー(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)])
フォームを使用してください。
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)