将目录树表示为 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的主要内容,如果未能解决你的问题,请参考以下文章

使用 JQ 构建目录树的 JSON

在Asp.net core使用配置Json创建动态目录树

JAVA目录树

Eclipse:如何使目录树显示为包

如何将目录树输出为 HTML?

表达式树的介绍