2016-06-06 5 views
0

Мне нужно захватить строки из всех файлов в каталоге и записать их как-то, поэтому я попытался использовать defaultdict для создания этого, но мне трудно понять, как постепенно добавлять в каждый слой словаря. По сути, то, что словарь должен выглядеть так:Python: defaultdict (dict) как создать вложенный словарь?

Имя файла

Bundle

информация

Bundle

информация

Имя файла

Bundle

информация

и т.д. У меня есть данные в виде списка, поэтому я могу просто добавьте все, что мне нужно, в список, но когда я запустил то, что у меня здесь, я получаю один комплект и информацию для каждого имени файла. Кажется, что функция update() заменяет значения внутри, и я не уверен, как заставить ее продолжать добавлять, а затем создавать более новый словарь для каждого пакета. Любая помощь приветствуется и извините за любую путаницу.


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() 

ответ

2

Словарь является то, что имеет ключ и значение, в любое время вы положили что-то в словарь, который имеет тот же ключ, он заменит это значение. Например:

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 

Есть несколько вещей, которые не имеют смысла о вашем коде, но я предлагаю вам использовать выше синтаксис фактически добавление элементов словаря (а не метод обновления, как используется для добавления списка пар ключ/значение в словарь).

Ниже я отметил некоторые предложения в свой код с # ** '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() 

** Редактировать **

Глядя на ваш вопрос, вам нужно иметь несколько пучков для каждого файла. Но ваша структура словаря недостаточно детальная, и вы, похоже, не предоставляете код того, как вы инициализировали устройства данными.

В принципе, вы должны подумать о том, какие ключи будут иметь каждый уровень словаря, а не только какие значения.

приборы (имя файла: device)
device (bundle_name?: Информация) < - Вы пропали без вести этот словарь
информации (список, который вы добавляете детали к)

Я изменил код выше с моим лучшим предположением относительно того, что вы хотели.

+0

Спасибо за понимание! Я закончил тем, что начал работать, и ваши комментарии помогли мне упростить его. – dreamville

Смежные вопросы