2017-06-30 9 views
2

以下は、辞書のリストを取り出してCSVファイルに書き込むコードです。Python CSVモジュールを使用して、毎回同じ順序で列を保持するCSVに書き込む

import csv 

def createBaselineCSV(baselineDictionaryList, name): 

    toCSV = baselineDictionaryList 

    keys = toCSV[0].keys() 
    print(keys) 
    with open(name, 'w') as output_file: 
     dict_writer = csv.DictWriter(output_file, fieldnames=keys) 
     dict_writer.writeheader() 
     dict_writer.writerows(toCSV) 

contacts = [{'Name':'John Smith', 'Email':'[email protected]', 'Phone':'888-888-8888'}, {'Name':'Keith Stone', 'Email':'[email protected]', 'Phone':'000-000-000'}] 

createBaselineCSV(contacts, 'contacts.csv') 

ただし、作成されたCSVファイルの列は、新しいスプレッドシートが作成されるたびに一貫した形式を維持しません。それはこのようになりますCSVになるかもしれない

Name, Email, Phone 
John Smith, [email protected], 888-888-8888 
Keith Stone, [email protected], 000-000-0000 

次回:だから、1時間、それは次のようになりますCSV作成することがあります

Email, Phone, Name 
[email protected], 888-888-8888, John Smith 
[email protected], 000-000-0000, Keith Stone 

を確実にする良い方法はありますが、その毎回固定位置にある列セルを使用してCSVが作成されますか?たとえば、列Aは常に「名前」、列Bは常に「電子メール」、列Cは常に「電話」です。

これは、関数内のコードを再フォーマットするのではなく、辞書のリスト以外の異なるデータ型(辞書が指定された順序を維持しないため)でcreateBaselineCSVを呼び出すことを意味すると思います。最善のアプローチは何でしょうか?

+1

はDictWriterを使用するか、またはあなたがしなければならない場合collections.OrderedDictを使用しないでください。辞書は本質的に命令されていません。 –

答えて

4

あなたの問題はfieldnames=keysです。keysは、注文のない辞書からのものです。ちょうどfieldnames=['Name', 'Email', 'Phone']またはそれが欲しいものを設定してください。 dictsとDictWriterを引き続き使用できます。

+1

またはOrderedDictを使用する – NightHallow

1

pandasが、これは非常に簡単です:

import pandas as pd 

contacts = [{'Name':'John Smith', 'Email':'[email protected]', 'Phone':'888-888-8888'}, {'Name':'Keith Stone', 'Email':'[email protected]', 'Phone':'000-000-000'}] 
df = pd.DataFrame(contacts) 
df[['Name', 'Email', 'Phone']].to_csv('contacts.csv', index=False) 
関連する問題