2017-02-18 59 views
2

我有一个嵌套的字典是这样的:从嵌套的dict |创建文件树Python 2.7版

Main = { 
    'root' : { 
     'object': 'data' 
     'users': { 
      'otherobj': 'data' 
     } 
    } 
} 
  • 我需要从它在本地目录/tree/其中每个字典的名称为文件夹的名称创建一个文件树
  • 每个字典中的所有值都属于它
  • 所有不是字典的值都被忽略。 (我会分开处理)
  • 树的深度将是未知的。
  • 每个目录可以(通常会)有多个子目录。
+0

@ZdaR一手满是谷歌的虚假魔术,根本没有帮助我。真相是我不知道该怎么尝试。这就是我来这里的原因。 – Cyanite

+1

操作文件和目录的有用函数在'os','os.path'和'shutil'模块中。你可以使用递归函数来遍历你的字典。 –

回答

0

如果我理解正确,你想要的东西,如以下落得:

  • root/objectdata
  • root/users/otherobjdata

所以让我们来破解这个有点。基本上,您需要做两件事情的能力:

  • 决定在你的字典键的值是否为“数据”,或给予一定的数据的另一种解释
  • ,它与给定的路径写入到一个文件

我将它留给你写这些功能,但我认为它们具有以下特征:

  • def is_data(obj)返回True/False(这可能是not isinstanceof(obj, dict),除非你的数据对象可能是一些特殊的属性类型的字典)
  • def write_data(directory, filename, obj)

在这一点上,我们已经准备好写遍历树的功能。我假设你将第一个关键字和字典从Main中取出。对于每个(键,值)对,我们需要检查值是“数据”还是另一个字典。如果是数据,写出来。如果是另一个字典,我们将密钥添加到我们的路径中,并拨打字典。

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

如果字典中的对象不是字典的(例如:''something':'那不是字典'),它需要被忽略。 – 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