将目录树表示为 JSON
Posted
技术标签:
【中文标题】将目录树表示为 JSON【英文标题】:Represent directory tree as JSON 【发布时间】:2014-10-03 06:34:29 【问题描述】:有没有简单的方法来生成这样的 JSON?我找到了os.walk()
和os.listdir()
,所以我可以递归下降到目录并构建一个python 对象,嗯,但这听起来像是在重新发明一个***,也许有人知道这样的任务的工作代码?
"type": "directory",
"name": "hello",
"children": [
"type": "directory",
"name": "world",
"children": [
"type": "file",
"name": "one.txt"
,
"type": "file",
"name": "two.txt"
]
,
"type": "file",
"name": "README"
]
【问题讨论】:
【参考方案1】:我不认为这个任务是一个“***”(可以这么说)。但这是您可以通过您提到的工具轻松实现的目标:
import os
import json
def path_to_dict(path):
d = 'name': os.path.basename(path)
if os.path.isdir(path):
d['type'] = "directory"
d['children'] = [path_to_dict(os.path.join(path,x)) for x in os.listdir\
(path)]
else:
d['type'] = "file"
return d
print json.dumps(path_to_dict('.'))
【讨论】:
有没有办法递归地做到这一点 这是递归的。【参考方案2】:在 Linux 上,可以使用命令行工具tree
,尽管它默认没有安装。输出几乎与 OP 要求的相同,使用标志 -J
进行 JSON 输出(然后可以流式传输到文件中):
tree -J folder
在 OSX 上,可以通过Homebrew 安装此工具。
【讨论】:
我认为您应该提供更多信息。目前它更像是一个评论而不是一个真正的答案......;) 这很有趣并且有效。不过,启动一个单独的进程并读取其输出是特定于 Linux 的,而不是纯粹的 Python。 我在man page 上看不到-J
标志。是否有某个版本的tree
具有 json 输出?
这为我节省了大量时间(angularJS + gulp 迁移到 webpack),谢谢【参考方案3】:
我只需要这样做(好吧,几乎)所以点击此页面,但 above 不会递归到子目录中。
所以这个版本只处理目录,而不是文件,但你可以添加这些。
首先生成一个嵌套的python dict:
def fs_tree(root):
results =
for (dirpath, dirnames, filenames) in os.walk(root):
parts = dirpath.split(os.sep)
curr = results
for p in parts:
curr = curr.setdefault(p, )
return results
然后使用 json
模块将其转储到 json。
【讨论】:
以上是关于将目录树表示为 JSON的主要内容,如果未能解决你的问题,请参考以下文章