2017-02-21 23 views
2

私はツイートに格納されている辞書のリストを持っており、これをwriterowsメソッドを使ってCSVファイルに書き込もうとしています。csvにマルチレベル辞書のリストを書き込む方法

サンプルリストは、次のようになります。

ここ
[{'sentiment': 'Unknown', 'date': datetime.datetime(2013, 1, 1, 5, 31, 32), 'body': 'mcd brk b'}, 
{'sentiment': 'Unknown', 'date': datetime.datetime(2013, 1, 1, 6, 55, 23), 'body': 'co hihq'}, 
{'sentiment': {'basic': 'Bullish'}, 'date': datetime.datetime(2013, 1, 1, 7, 36, 32), 'body': 'new year bac'}] 

sentimentキーは1つのレベルまたは2のいずれかを持っています。私はこれらの辞書をCSV形式に書き込んで、「Unknown」または「Bullish」のいずれかのこれらのキーの値しか持たないようにしています。

file = open('BAC.csv','w') 
keys=tweets[0].keys() 
dict_writer=csv.DictWriter(file,keys) 
dict_writer.writerows(tweets) 

私は次の形式

Unknown,2013-01-01 05:31:32,mcd brk b 
Unknown,2013-01-01 06:55:23,co hihq 
{'basic': 'Bullish'},2013-01-01 07:36:32,mnew year bac 

でcsvファイルを取得するしかし、私は

Unknown,2013-01-01 05:31:32,mcd brk b 
Unknown,2013-01-01 06:55:23,co hihq 
Bullish,2013-01-01 07:36:32,mnew year bac 

としてそれを必要とするが、これを行うための簡単な方法はありますか?多くの場合、レベルは5まで上がりますが、同様の取引では値が必要です。

答えて

0

これらの感情値を平坦化する関数を記述する必要があります。

各レベルに要素が1つしかない場合は、このようなことが起こります。

def flatten(row, field): 
    if isinstance(row[field], dict): 
     row[field] = row[field].values()[0] 
     return flatten(row, field) 
    return row 

次に、このメソッドをcsvに書き込む前に各行で呼び出す必要があります。

tweets = [{'sentiment': 'Unknown', 'date': datetime.datetime(2013, 1, 1, 5, 31, 32), 'body': 'mcd brk b'}, 
     {'sentiment': 'Unknown', 'date': datetime.datetime(2013, 1, 1, 6, 55, 23), 'body': 'co hihq'}, 
     {'sentiment': {'basic': {'text': 'Bullish' } }, 'date': datetime.datetime(2013, 1, 1, 7, 36, 32), 'body': 'new year bac'}] 

print [flatten(row, 'sentiment') for row in tweets] 

出力

[{'date': datetime.datetime(2013, 1, 1, 5, 31, 32), 'body': 'mcd brk b', 'sentiment': 'Unknown'}, 
{'date': datetime.datetime(2013, 1, 1, 6, 55, 23), 'body': 'co hihq', 'sentiment': 'Unknown'}, 
{'date': datetime.datetime(2013, 1, 1, 7, 36, 32), 'body': 'new year bac', 'sentiment': 'Bullish'}] 
関連する問題