次のような辞書のリストがあります。
toCSV = [{'name':'bob','age':25,'weight':200},{'name':'jim','age':31,'weight':180}]
これを次のようなcsvファイルに変換するにはどうすればよいですか?
name,age,weight
bob,25,200
jim,31,180
次のような辞書のリストがあります。
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
to_csv = [
{'name': 'bob', 'age': 25, 'weight': 200},
{'name': 'jim', 'age': 31, 'weight': 180},
]
keys = to_csv[0].keys()
with open('people.csv', 'w', newline='') as output_file:
dict_writer = csv.DictWriter(output_file, keys)
dict_writer.writeheader()
dict_writer.writerows(to_csv)
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
Python 3ではパラメータが必要であることに注意してnewline=''
ください。そうしないと、Excel/opencalcで開くときにCSVに空白行が表示されます。または、モジュール内のcsvハンドラーを使用することをお勧めしpandas
ます。エンコーディングの問題に対する耐性が高く、パンダはファイルの読み込み時に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で動作している場合)。詳細については、PythonPandasDataFrameでの列の順序の保持を参照してください。これは、辞書リストが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)
行のリスト(メモリに収まらない可能性があります)またはヘッダーのコピー(write_csv
関数が汎用である可能性があります)がないと仮定した場合の、もう1つのより一般的な解決策を次に示します。
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ファイルにデータを書き込む最も簡単な方法です。
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)