2017-01-24 6 views
0

Ich habe ein Wörterbuch, das wie folgt aussieht:Export csv aus verschachtelten Python Wörterbuch

{u'results': [{u'bucket': u'Table', 
      u'data': [{u'Geography_dst': u'PE', 
         u'avg_bps': 5054970470.588235, 
         u'device': u'taco', 
         u'as': u'Telephone Company', 
         u'next_hop': u'Telephone Companu', 
         u'key': blah, 
         u'max_bps': 6613494000, 
         u'p95th_bps': 6280622000, 
         u'timeSeries': {}}, 

[Kürze halber gekürzt]

ich nicht scheinen, um herauszufinden, wie können Sie dieses Wörterbuch in eine CSV analysieren . Ich habe Probleme, herauszufinden, wie eine Spalte in den ‚Daten‘ Tupel aus jedem Schlüssel zu machen und habe die Zeilen aus den entsprechenden Werten füllen:

device,as,nexthop,Geography_dst,max_bps,p95th_bps,avg_bps 

(und ja, ich würde es vorziehen, nicht zu haben, die 'Schlüssel' oder die Zeitreihen Tupel in der CSV überhaupt, aber ich denke, das wird offensichtlich sein, sobald ich herausfinden, wie man mit dieser Datenstruktur arbeiten).

Danke!

+0

Sie möchten nur den 'Daten' Teil in eine Datei speichern und ignorieren, was oben ist? – DonTintoretto

+0

Ja, das ist richtig. – learhy

Antwort

0

Ich nahm die Annahme, dass Sie nur den Datenteil speichern möchten und dass es aus mehreren Wörterbüchern mit demselben Schlüssel besteht. Hier ist der Code, der die 'Daten' konvertieren und speichern kann.

, die das Problem lösen würde:

import csv 

big_dict = { 
    'reslts': [{ 
     'bcket': 'Table', 
     'data': [{ 
      'Geography_dst': 'PE', 
      'avg_bps': 5054970470.588235, 
      'device': 'taco', 
      'as': 'Telephone Company', 
      'next_hop': 'Telephone Compan', 
      'key': 'blah', 
      'max_bps': 6613494000, 
      'p95th_bps': 6280622000, 
      'timeSeries': {} 
     }, 
     { 
      'avg_bps': 5054970470.588235, 
      'device': 'taco', 
      'as': 'Telephone Company', 
      'next_hop': 'Telephone Compan', 
      'key': 'blah', 
      'p95th_bps': 6280622000, 
      'timeSeries': {}, 
      'Geography_dst': 'XE', 
      'max_bps': 6613494000 
     }] 
    }] 
} 

my_dicts = big_dict['reslts'][0]['data'] 

with open('mycsvfile.csv', 'w') as f: # Just use 'w' mode in 3.x 
    keys_saved = False 
    for my_dict in my_dicts: 
     w = csv.DictWriter(f, my_dict.keys()) 
     if not keys_saved: 
      w.writeheader() 
      keys_saved = True 
     w.writerow(my_dict) 

Bitte beachten Sie, dass diese behandelt den Fall, wenn Sie die gleichen Schlüssel überall, aber nicht unbedingt in der gleichen Reihenfolge.

+0

Im Allgemeinen ist die Reihenfolge der Schlüssel in einem Dict nicht vorhersehbar und kann bei jeder Ausführung des Programms geändert werden. Daher sollten Sie 'my_dict.keys()' nicht an 'csv.DictWriter' übergeben. Stattdessen sollten Sie eine feste Liste von Schlüsseln übergeben. –

+0

Die Reihenfolge der Schlüssel in einem Diktat ist nicht zufällig, sondern kann sich ändern, wenn Python aktualisiert wurde. Alternativen zu einer festen Liste: Übergeben Sie 'sorted (my_dict.keys())', um eine Reihenfolge zu korrigieren, oder verwenden Sie 'collections.OrderedDict', um sicherzustellen, dass Schlüssel immer in der Reihenfolge ihrer Erstellung sind (die von der Datenquelle definiert wird). . – nigel222

1

können Sie csv.DictWriter verwenden, die Felder von dict schreibt auf der Grundlage der zum Konstruktor Anweisungen:

import csv 
COLUMNS = 'device,as,next_hop,Geography_dst,max_bps,p95th_bps,avg_bps' 

d = { 
    u'results': [{ 
     u'bucket': u'Table', 
     u'data': [{ 
      u'Geography_dst': u'PE', 
      u'avg_bps': 5054970470.588235, 
      u'device': u'taco', 
      u'as': u'Telephone Company', 
      u'next_hop': u'Telephone Companu', 
      u'key': None, 
      u'max_bps': 6613494000, 
      u'p95th_bps': 6280622000, 
      u'timeSeries': {} 
     }] 
    }] 
} 

with open('output.csv', 'w') as f: 
    writer = csv.DictWriter(f, extrasaction='ignore', fieldnames=COLUMNS.split(',')) 
    writer.writeheader() 
    rows = (row for bucket in d['results'] for row in bucket['data']) 
    writer.writerows(rows) 

Ausgabe in output.csv:

device,as,next_hop,Geography_dst,max_bps,p95th_bps,avg_bps 
taco,Telephone Company,Telephone Companu,PE,6613494000,6280622000,5054970470.588235 

In oben csv.DictWriter(f, extrasaction='ignore', fieldnames=COLUMNS.split(',')) schafft ein Writer-Objekt. extrasaction weist es an, die Tasten zu überspringen, die in fieldnames nicht vorhanden sind. fieldnames ist eine sortierte Liste der Schlüssel, die Sie von jedem dict schreiben möchten. writeheader schreibt nur die Spaltennamen, Sie können dies überspringen, wenn Spalten nicht benötigt werden.

rows ist ein Generatorausdruck, der über die Ergebnisse und Objekte innerhalb eines Ergebnisses iteriert. Es gibt die Dicts zurück, die Sie nacheinander schreiben möchten. Schließlich wird der Generator an writerows übergeben, der alle vom Generator zurückgegebenen Dicts in die Datei schreibt.

+0

das hat perfekt funktioniert! vielen Dank! – learhy