2016-06-06 26 views
0

Ich muss Saiten aus allen Dateien in einem Verzeichnis greifen und sie irgendwie aufzeichnen, also habe ich versucht, defaultdict zu verwenden, um dies zu erstellen, aber ich habe Schwierigkeiten herauszufinden, wie schrittweise zu jeder Ebene des Wörterbuchs hinzuzufügen. Im Wesentlichen, was das Wörterbuch aussehen sollte, ist dies:Python: defaultdict (dict) wie man ein verschachteltes Wörterbuch erstellt?

Dateiname

Bundle

Info

Bundle

Info

Dateiname

Bundle

Info

etc habe ich die Info als eine Liste, so kann ich füge einfach alles hinzu, was ich brauche, aber wenn ich das hier ausführe, bekomme ich ein einzelnes Bündel und Informationen für jeden Dateinamen. Es scheint, als ob die update() - Funktion die Werte im Inneren ersetzt und ich bin mir nicht sicher, wie ich das hinzufügen und dann ein neueres Wörterbuch für jedes Bundle erstellen kann. Jede Hilfe wird geschätzt, und wir bitten um Verständnis.


import collections 
import os 

devices = collections.defaultdict(lambda: collections.defaultdict(dict)) 
# bundles = collections.defaultdict(dict) 

for filename in os.listdir('.'): 
    if os.path.isfile(filename): 
     if '.net' in filename: 
      dev = open(filename) 

      for line in dev: 

       line = line.strip() 
       values = line.split(' ') 

       if values[0] == 'interface': 
        bundle_name = values[1] 
        if '/' in bundle_name: 
         pass 
        else: 
         if len(values) == 2: 
          ur_device = devices[filename] 
          ur_device.update(
           { 
            'bundle_name': bundle_name, 
            'bundle_info': [], 
           } 
          ) 

       if 'secondary' in values: 
        pass 
       elif values[0] == 'ipv4' and values[1] == 'address' and len(values) == 4: 
        ur_device['bundle_info'].append(
         { 
          'ip_address': values[2], 
          'subnet_mask': values[3], 
         } 
        ) 

      dev.close() 

Antwort

2

Ein Wörterbuch ist etwas, das einen Schlüssel und einen Wert hat, jedes Mal, wenn etwas in ein Wörterbuch setzen, die denselben Schlüssel hat, wird es diesen Wert zu ersetzen. Zum Beispiel:

dictionary = {} 
# Insert value1 at index key1 
dictionary["key1"] = "value1" 

# Overwrite the value at index key1 to value2 
dictionary["key1"] = "value2" 

print(dictionary["key1"]) # prints value2 

Es gibt ein paar Dinge, die keinen Sinn über Ihren Code, aber ich schlage vor, Sie die obige Syntax für tatsächlich Dinge in das Wörterbuch (und nicht die Update-Methode verwendet wie das Hinzufügen wird zum Hinzufügen einer Liste von Schlüssel/Wert-Paaren in ein Wörterbuch).

Im Folgenden werde ich einige Vorschläge, um Ihren Code mit # markiert ** s

import collections 
import os 

#** I'm guessing you want to put your devices into this dict, but you never put anything into it 
devices = collections.defaultdict(lambda: collections.defaultdict(dict)) 
# bundles = collections.defaultdict(dict) 

for filename in os.listdir('.'): 
    if os.path.isfile(filename): 
     if '.net' in filename: 
      dev = open(filename) 

      for line in dev: 

       line = line.strip() 
       values = line.split(' ') 
       #** declare bundle_name out here, it is better form since we will make use of it in the immediate scopes below this 
       bundle_name = '' 

       if values[0] == 'interface': 
        bundle_name = values[1] 
        if '/' in bundle_name: 
         pass 
        else: 
         if len(values) == 2: 
          #** This is assuming you populated devices somewhere else?? 
          devices[filename][bundle_name] = [] 

       if 'secondary' in values: 
        pass 
       elif values[0] == 'ipv4' and values[1] == 'address' and len(values) == 4: 
        #** ur_device was not declared in this scope, it is a bad idea to use it here, instead index it out of the devices dict 
        #** it also might be worth having a check here to ensure devices[filename] actually exists first 
        devices[filename][bundle_name].append(
         { 
          'ip_address': values[2], 
          'subnet_mask': values[3], 
         } 
        ) 

      dev.close() 

** ** Bearbeiten

auf Ihre Frage suchen, sind Sie mehrere Bundles für jeden Dateinamen haben müssen. Aber Ihre Dictionary-Struktur ist nicht detailliert genug und Sie scheinen nicht den Code für die Initialisierung von Geräten mit Daten bereitzustellen.

Grundsätzlich sollten Sie darüber nachdenken, welche Schlüssel jede Ebene des Wörterbuchs haben wird, nicht nur welche Werte.

Geräte (Dateiname: Gerät)
Gerät (Bundle_Name?: Info) < - Sie fehlen dieses Wörterbuch
info (Liste, die Sie Details anhängen)

Ich änderte den obigen Code mit meinem besten erraten, was Sie wollten.

+0

Danke für die Einsicht! Am Ende habe ich es zur Arbeit gebracht, und Ihre Kommentare haben mir geholfen, es zu vereinfachen. – dreamville