如何将多级词典列表写入csv

时间:2017-02-21 03:32:05

标签: python

我有一个存储在推文中的词典列表,我正在尝试使用writerows方法将这些词典写入csv文件。

Sample List看起来像这样:

[{'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)

我以下列格式获取csv文件

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

但我需要它

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

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

1 个答案:

答案 0 :(得分: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'}]