2017-02-18 16 views
2

У меня есть вложенный словарь, как это:Создание дерева файлов из вложенного dict | Python 2.7

Main = { 
    'root' : { 
     'object': 'data' 
     'users': { 
      'otherobj': 'data' 
     } 
    } 
} 
  • Мне нужно создать файл дерева из него в локальной директории /tree/, где имя каждого Dict это имя папки
  • Все значения внутри каждого dict принадлежат ему
  • Все значения, которые не являются dict, игнорируются. (Я буду обрабатывать их отдельно)
  • Глубина дерева будет неизвестна.
  • Каждый каталог может (и обычно будет) иметь несколько поддиректоров.
+0

@ZdaR Рука, полная ложной магии Google, которая мне совсем не помогла. Правда, я не знаю, что попробовать. Вот почему я здесь. – Cyanite

+1

Полезные функции для управления файлами и каталогами находятся в модулях 'os',' os.path' и 'shutil'. Вы можете использовать их из рекурсивной функции, которая проходит через ваш диктофон. –

ответ

0

Если я правильно понять, вы хотите, чтобы в конечном итоге что-то вроде следующего:

  • root/object содержащего data
  • root/users/otherobj, содержащего data
  • и так далее

Итак, давайте сломаем это немного. Вы в основном должны иметь возможность сделать две вещи:

  • определить, является ли значение ключа в вашем словаре есть «данные» или другой словарь
  • дал некоторые данные, записать его в файл с заданной траектории

Я собираюсь оставить вас, чтобы написать эти функции, но я предполагаю, что они имеют следующие подписи:

  • def is_data(obj) возвращающиеся True/False (это может быть not isinstanceof(obj, dict), если ваши данные объекты не могут быть dicts с некоторыми специальными свойствами)
  • def write_data(directory, filename, obj)

На данный момент мы готовы написать функцию, чтобы ходить по дереву. Я собираюсь предположить, что вы вытащили первый ключ и словарь из Main. Для каждой пары (ключ, значение) нам нужно проверить, является ли значение «данными» или если это другой dict. Если это данные, напишите. Если это еще один dict, мы добавляем ключ к нашему пути и вызываем нашу функцию на , что dict.

def walk(root_directory, obj_dict): 
    for k, v in obj_dict.iteritems(): 
     if is_data(v): 
      # write the file 
      write_data(root_directory, k, v) 
     else: # it's another dict, so recurse 
      # add the key to the path 
      new_root = os.path.join(root_directory, k) # you'll need to import os 
      walk(new_root, v) 
+0

Если объекты в dict не являются dict (например: '' something ':' that is not the dict''), его нужно игнорировать. – Cyanite

+0

На самом деле я могу просто ввести в действие это здесь. Но создадут ли эти каталоги, если в файле dict нет файлов? – Cyanite

+0

(тем самым я имею в виду игнорировать мой первый комментарий) – Cyanite

0

Этот фрагмент кода должен помочь. Здесь я предполагаю, что скрипт python будет запущен в целевом локальном каталоге.

import os 

# dir_definition = <your 'Main'> 

def create_dirs(dir_definition): 
    for dir_dame, sub_dir in dir_definition.items(): 
     os.mkdir(dir_dame) 
     if isinstance(sub_dir, dict): 
      create_dirs(sub_dir) 
+1

Проблема действительно заключается в том, чтобы попросить рекурсивного решения. – Elmex80s

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

  • Нет связанных вопросов^_^