2017-02-13 3 views
0

Ich habe eine Tabelle, die ich versuche, die Daten in eine Reihe von verschachtelten Python-Wörterbüchern zu importieren. Im Wesentlichen enthält das Arbeitsblatt Spalten für Standort, Gebäude, Stockwerk, Raum, Reihe und Rack. Ich würde die Datenstruktur wie wie folgt aussehen:Importieren von Excel-Daten in verschachteltes Wörterbuch

sites = [ 
    { 
    "name": "", 
    "descr": "", 
    "buildings": [ 
     { 
     "name": "", 
     "descr": "", 
     "floors": [ 
      { 
      "name": "", 
      "descr": "", 
      "rooms": [ 
       { 
       "name": "", 
       "descr": "", 
       "rows": [ 
        { 
        "name": "", 
        "descr": "", 
        "racks": [ 
         { 
         "name": "", 
         "descr": "" 
         } 
        ] 
        } 
       ] 
       } 
      ] 
      } 
     ] 
     } 
    ] 
    } 
] 

Ein Beispiel für die Tabelle wäre:

+------+---------------+----------+----------------+-------+-------------+------+------------+-----+-----------+------+------------+-------------------------------------------------------------------+ 
| site | site_descr | building | building_descr | floor | floor_descr | room | room_descr | row | row_descr | rack | rack_descr | rack_dn                | 
+------+---------------+----------+----------------+-------+-------------+------+------------+-----+-----------+------+------------+-------------------------------------------------------------------+ 
| dc1 | Data Center 1 | alpha | Alpha Building | 1  | Floor 1  | 100 | Room 100 | A | Row A  | A5 | Rack A5 | uni/fabric/site-dc1/building-alpha/floor-1/room-100/row-A/rack-A5 | 
+------+---------------+----------+----------------+-------+-------------+------+------------+-----+-----------+------+------------+-------------------------------------------------------------------+ 
| dc1 | Data Center 1 | alpha | Alpha Building | 1  | Floor 1  | 100 | Room 100 | A | Row A  | A5 | Rack A5 | uni/fabric/site-dc1/building-alpha/floor-1/room-100/row-A/rack-A5 | 
+------+---------------+----------+----------------+-------+-------------+------+------------+-----+-----------+------+------------+-------------------------------------------------------------------+ 
| dc1 | Data Center 1 | alpha | Alpha Building | 1  | Floor 1  | 200 | Room 200 | A | Row A  | A5 | Rack A5 | uni/fabric/site-dc1/building-alpha/floor-1/room-200/row-A/rack-A5 | 
+------+---------------+----------+----------------+-------+-------------+------+------------+-----+-----------+------+------------+-------------------------------------------------------------------+ 
| dc1 | Data Center 1 | alpha | Alpha Building | 1  | Floor 1  | 100 | Room 100 | B | Row B  | B5 | Rack B5 | uni/fabric/site-dc1/building-alpha/floor-1/room-100/row-B/rack-B5 | 
+------+---------------+----------+----------------+-------+-------------+------+------------+-----+-----------+------+------------+-------------------------------------------------------------------+ 
| dc1 | Data Center 1 | alpha | Alpha Building | 2  | Floor 2  | 100 | Room 100 | A | Row A  | A7 | Rack A7 | uni/fabric/site-dc1/building-alpha/floor-2/room-100/row-A/rack-A7 | 
+------+---------------+----------+----------------+-------+-------------+------+------------+-----+-----------+------+------------+-------------------------------------------------------------------+ 
| dc2 | Data Center 2 | beta  | Beta Building | 5  | Floor 5  | 200 | Room 200 | B | Row B  | B5 | Rack B5 | uni/fabric/site-dc2/building-beta/floor-5/room-200/row-B/rack-B5 | 
+------+---------------+----------+----------------+-------+-------------+------+------------+-----+-----------+------+------------+-------------------------------------------------------------------+ 

Was ist der beste Weg, dies in meiner Datenstruktur zu bekommen? Das pyexcel-Modul kann Datensätze importieren, die im Grunde eine Liste von Wörterbüchern mit jeder Zeile als Eintrag in der Liste erstellen. Ich habe Probleme mit der Logik, um dies zu restrukturieren ...

Sollte ich die Struktur vor den for-Schleifen initialisieren? Soll ich die Struktur einfach so aufbauen, wie ich sie bevölkere? Wenn ich die Struktur mit Leerzeichen wie unten initialisiere, müsste ich sicherstellen, dass meine erste Zeile diese Leerzeichen ausfüllt, was mich denken lässt, dass Letzteres die bessere Option sein könnte.

+0

Diese Frage würde stark von einem Beispiel [Minimal, vollständig und verifizierbar] (http://stackoverflow.com/help/mcve) profitieren. Das erleichtert es uns, Ihnen zu helfen. Insbesondere gibt es keine Beispieldaten oder Code, den Sie bereits ausprobiert haben. –

+0

@StephenRauch Ich habe meinen Beitrag mit der Tabelle aktualisiert, mit der ich arbeite. Ich habe noch keinen richtigen Code, weil ich Schwierigkeiten habe, überhaupt anzufangen. Ich habe das Gefühl, dass ich die "setdefault" Wörterbuch-Option verwenden muss, um etwas davon zu tun ... – mikey

Antwort

0

ich glaube, das, was zu tun ist über die Spaltennamen iterieren, suchen Sie nach einem Wörterbuch mit dem richtigen Namen für die Spalte, erstellen Sie es, wenn es nicht und dann in seine Reihe von Kindern voran existiert:

import pprint 

columns = ['site', 'building', 'floor', 'room', 'row', 'rack'] 
keys = ['buildings', 'floors', 'rooms', 'rows', 'racks'] 

def find(seq, pred): 
    try: 
     found = next(x for x in seq if pred(x)) 
    except StopIteration: 
     found = None 
    return found 

def add_record(sites, record): 
    array = sites 
    for index, column in enumerate(columns): 
     name = record[column] 
     descr = record[column + '_descr'] 
     dictionary = find(array, lambda x: x['name'] == name) 
     if dictionary is None: 
      dictionary = {'name': name, 'descr' : descr} 
      if column != 'rack': 
       dictionary[keys[index]] = [] 
      array.append(dictionary) 
     if column != 'rack': 
      array = dictionary[keys[index]] 
     else: 
      dictionary['rack_dn'] = record['rack_dn'] 



def main(): 
    records = [{'site': 'dc1', 'site_descr' : 'Data Center 1', 'building' : 'alpha', 
       'building_descr': 'Alpha Building', 'floor' : 1, 'floor_descr' : 'Floor 1', 
       'room' : 100, 'room_descr' : 'Room 100', 'row' : 'A', 'row_descr': 'Row A', 
       'rack': 'A5', 'rack_descr' : 'Rack A5', 
       'rack_dn' : 'uni/fabric/site-dc1/building-alpha/floor-1/room-100/row-A/rack-A5'}, 
       {'site': 'dc1', 'site_descr' : 'Data Center 1', 'building' : 'alpha', 
       'building_descr': 'Alpha Building', 'floor' : 1, 'floor_descr' : 'Floor 1', 
       'room' : 200, 'room_descr' : 'Room 200', 'row' : 'A', 'row_descr': 'Row A', 
       'rack': 'A5', 'rack_descr' : 'Rack A5', 
       'rack_dn' : 'uni/fabric/site-dc1/building-alpha/floor-1/room-200/row-A/rack-A5'}, 
       {'site': 'dc2', 'site_descr' : 'Data Center 2', 'building' : 'beta', 
       'building_descr': 'Beta Building', 'floor' : 5, 'floor_descr' : 'Floor 5', 
       'room' : 200, 'room_descr' : 'Room 200', 'row' : 'B', 'row_descr': 'Row B', 
       'rack': 'B5', 'rack_descr' : 'Rack B5', 
       'rack_dn' : 'uni/fabric/site-dc2/building-beta/floor-5/room-200/row-B/rack-B5'}] 
    sites = [] 
    for record in records: 
     add_record(sites, record) 
    pp = pprint.PrettyPrinter() 
    pp.pprint(sites) 
+0

Ich denke, das ist ziemlich nah. Wenn ich es ausführe, sieht es so aus, als würde ich die Struktur erstellen, die ich brauche, aber alle meine 'descr' Schlüssel sind leer, wenn ich auf die Ausgabe schaue. Ich versuchte, das columns-Objekt zu überarbeiten, um site_descr, building_descr usw. hinzuzufügen, da diese Spalten aber Fehler mit einem 'IndexError: list index out of range' Fehler sind. – mikey

+0

@mikey, ich habe meine Antwort aktualisiert, um die Spalten '* _descr' und die' rack_dn' zu holen –

+0

Das scheint gut zu funktionieren. Ich danke dir sehr! Ich habe den rack_dn-Teil entfernt, weil ich das aus der Tabelle entfernen wollte. Jetzt muss ich nur sehen, ob ich herausfinden kann, was der Code tatsächlich macht ... – mikey

Verwandte Themen