将目录树表示为JSON

33

有没有简单的方法生成这样一个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"
    }
  ]
}
3个回答

51

我不认为这个任务是一个“轮子”(可以这么说)。但是,通过你提到的工具,你可以很容易地实现它:

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('.'))

有没有一种递归的方法来实现这个? - ScipioAfricanus
7
这是递归。 - Emanuele Paolini

27

在Linux上,可以使用命令行工具tree,尽管它不是默认安装的。使用标志-J进行JSON输出(然后可以将其流式传输到文件中,例如),输出几乎与OP所需相同:

tree -J folder
在OSX系统中,可以通过Homebrew安装此工具。

1
我认为你应该提供更多的信息。目前这更像是一条评论而不是一个真正的答案... ;) - Badacadabra
1
这很有趣,而且它能够工作。启动一个单独的进程并读取其输出是特定于Linux而不是纯Python的。 - Andrey Moiseev
3
我没有在man页面上看到-J标志。是否有某个版本的tree能够输出JSON格式? - pianoJames
这真的为我节省了大量时间(从AngularJS + Gulp迁移到Webpack),谢谢。 - mlg87

2

我刚刚不得不做这件事情(好吧,几乎是这样),所以打开了这个页面,但是以上不会递归到子目录。

所以这个版本只处理目录,而不是文件,但你可以添加它们。

首先生成一个嵌套的Python字典:

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格式。保留HTML。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接