web-dev-qa-db-ja.com

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

次のような辞書のリストがあります。

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

これを次のようなcsvファイルに変換するにはどうすればよいですか:

name,age,weight
bob,25,200
jim,31,180
124
Backus
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がより適切です。

235

Python csvモジュールには DictWriter があり、これはおそらく役立つでしょう。

19
Wilduck

これは、辞書リストが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'})
14
hamed

@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)
6
flowerflower

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)
  • python 3の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)

注意:

  • pandasは、ファイルにパスを指定すると、ファイルを開く処理を行い、デフォルトでpython3のutf8になり、ヘッダーも認識します。
  • データフレームはCSVが提供するものと同じ構造ではないため、ロード時に1行を追加して同じものを取得します:dataframe.to_dict('records')
  • また、pandasを使用すると、csvファイル内の列の順序をはるかに簡単に制御できます。デフォルトではアルファベット順になっていますが、列の順序を指定できます。 Vanilla csvモジュールでは、OrderedDictを供給する必要があります。そうしないと、ランダムな順序で表示されます(python <3.5で作業している場合)。参照: Python Pandas DataFrameで列の順序を保持 詳細.
5
Marc Maxmeister

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

0
eddygeek
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ファイルに書き込む最も簡単な方法です

0
jitsm555