从嵌套字典创建文件树 | Python 2.7
Create file-tree from nested dict | Python 2.7
我有一个这样的嵌套字典:
Main = {
'root' : {
'object': 'data'
'users': {
'otherobj': 'data'
}
}
}
- 我需要在本地目录中根据它创建一个文件树
/tree/
其中每个字典的名称就是文件夹的名称
- 每个字典中的所有值都属于它
- 所有不是字典的值都将被忽略。 (我会分别处理)
- 树的深度将是未知的。
- 每个目录可以(而且通常会)有多个子目录。
此代码段应该有所帮助。这里我假设 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)
如果我没理解错的话,你希望得到如下结果:
root/object
包含 data
root/users/otherobj
包含 data
- 等等
所以让我们稍微分解一下。您基本上需要能够做两件事:
- 确定字典中某个键的值是 "data" 还是另一个字典
- 给定一些数据,将其写入具有给定路径的文件
我将留给您编写这些函数,但我假设它们具有以下签名:
def is_data(obj)
返回 True/False
(这可能是 not isinstanceof(obj, dict)
除非您的数据对象可能是具有某些特殊属性的字典)
def write_data(directory, filename, obj)
此时,我们已准备好编写一个函数来遍历树。我假设您从 Main
中取出第一个键和字典。对于每个 (key, value) 对,我们需要检查值是 "data" 还是另一个字典。如果是数据,就把它写出来。如果它是另一个字典,我们将键添加到我们的路径并在 that 字典上调用我们的函数。
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)
我有一个这样的嵌套字典:
Main = {
'root' : {
'object': 'data'
'users': {
'otherobj': 'data'
}
}
}
- 我需要在本地目录中根据它创建一个文件树
/tree/
其中每个字典的名称就是文件夹的名称 - 每个字典中的所有值都属于它
- 所有不是字典的值都将被忽略。 (我会分别处理)
- 树的深度将是未知的。
- 每个目录可以(而且通常会)有多个子目录。
此代码段应该有所帮助。这里我假设 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)
如果我没理解错的话,你希望得到如下结果:
root/object
包含data
root/users/otherobj
包含data
- 等等
所以让我们稍微分解一下。您基本上需要能够做两件事:
- 确定字典中某个键的值是 "data" 还是另一个字典
- 给定一些数据,将其写入具有给定路径的文件
我将留给您编写这些函数,但我假设它们具有以下签名:
def is_data(obj)
返回True/False
(这可能是not isinstanceof(obj, dict)
除非您的数据对象可能是具有某些特殊属性的字典)def write_data(directory, filename, obj)
此时,我们已准备好编写一个函数来遍历树。我假设您从 Main
中取出第一个键和字典。对于每个 (key, value) 对,我们需要检查值是 "data" 还是另一个字典。如果是数据,就把它写出来。如果它是另一个字典,我们将键添加到我们的路径并在 that 字典上调用我们的函数。
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)