2017-02-21 80 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键有任何一个一级或两级。我正在尝试将这些字典写成csv格式,以便我只将这些密钥的值设置为'未知'或'看涨'以上。

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 

有没有简单的方法来做到这一点?在很多情况下,这个水平会上升到五,但类似的交易只需要价值。

回答

0

您需要编写一个函数来平滑这些情感值。

如果您在每个关卡中只有一个元素,就可以使用类似的东西。

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'}]