从嵌套的dict创建文件树| Python 2.7

时间:2017-02-18 18:41:55

标签: python python-2.7 directory-structure

我有一个这样的嵌套字典:

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

2 个答案:

答案 0 :(得分: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 :(得分:0)

如果我理解得当,你最终会得到以下内容:

  • root/object包含data
  • root/users/otherobj包含data

所以让我们稍微分解一下。你基本上需要做两件事:

  • 确定词典中某个键的值是“数据”还是另一个词典
  • 给出一些数据,将其写入具有给定路径的文件

我将留给你写这些函数,但我会假设他们有以下签名:

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