【问题标题】:Represent directory tree as JSON将目录树表示为 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"
    }
  ]
}

【问题讨论】:

    标签: python json python-2.7 data-structures tree


    【解决方案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。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-12-20
      • 2021-12-26
      • 2019-04-23
      • 1970-01-01
      • 2019-06-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多