次のような辞書のリストがあります。
toCSV = [{'name':'bob','age':25,'weight':200},{'name':'jim','age':31,'weight':180}]
これを次のようなcsvファイルに変換するにはどうすればよいですか:
name,age,weight
bob,25,200
jim,31,180
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がより適切です。
Python csvモジュールには DictWriter があり、これはおそらく役立つでしょう。
これは、辞書リストが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'})
@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)
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
にはnewline=''
パラメーターが必要です。そうでない場合、Excel/opencalcで開くときにCSVに空白行が表示されます。または、pandas
モジュールのcsvハンドラーを使用することを好みます。エンコードの問題に対してより寛容であることがわかり、pandasはファイルをロードするときにCSVの文字列番号を正しいタイプ(int、floatなど)に自動的に変換します
import pandas
dataframe = pandas.read_csv(filepath)
list_of_dictionaries = dataframe.to_dict('records')
dataframe.to_csv(filepath)
注意:
utf8
になり、ヘッダーも認識します。dataframe.to_dict('records')
csv
モジュールでは、OrderedDict
を供給する必要があります。そうしないと、ランダムな順序で表示されます(python <3.5で作業している場合)。参照: Python Pandas DataFrameで列の順序を保持 詳細.行のリスト(メモリに収まらない可能性がある)またはヘッダーのコピー(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
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ファイルに書き込む最も簡単な方法です