2017-02-21 3 views
2

Ich habe eine Liste der Wörterbücher in Tweets gespeichert, und ich versuche, diese in eine CSV-Datei mit writerows Methode schreiben.Wie schreibe ich Liste von Multilevel-Wörterbücher in CSV

Beispielliste sieht wie folgt aus:

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

Hier sentiment Schlüssel hat entweder eine Ebene oder zwei. Ich versuche, diese Wörterbücher in ein csv-Format zu schreiben, so dass ich nur die Werte dieser Schlüssel für oben entweder "Unbekannt" oder "Bullish" habe.

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

Ich erhalte die CSV-Datei in folgendem Format

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 

Aber ich brauche es als

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 

Gibt es eine einfache Möglichkeit, dies zu tun? In vielen Fällen reichen die Stufen bis zu fünf, aber ähnliche Geschäfte brauchen nur den Wert.

Antwort

0

Sie müssen eine Funktion schreiben, um diese Sentiment-Werte zu reduzieren.

So etwas könnte funktionieren, wenn Sie in jedem Level nur ein Element haben.

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

Dann müssten Sie diese Methode in jeder Zeile aufrufen, bevor Sie sie in den CSV schreiben.

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] 

Ausgabe

[{'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'}] 
Verwandte Themen