将目录树表示为JSON

时间:2014-08-10 06:41:00

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

有没有简单的方法来生成这样的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 个答案:

答案 0 :(得分:29)

我不认为这个任务是一个"轮" (可以这么说)。但是你可以通过你提到的工具轻松实现这一目标:

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

答案 1 :(得分:11)

在Linux上,可以使用命令行工具tree,但默认情况下。输出几乎与OP所需的输出相同,使用标记-J进行JSON输出(例如,可以将其传输到文件):

tree -J folder

在OSX上,可以通过Homebrew安装此工具。

答案 2 :(得分:0)

我只需要这样做(好了,差不多),所以点击此页面,但是above不会递归到子目录中。

因此,此版本仅处理目录,而不处理文件,但是您可以添加这些目录。

首先生成一个嵌套的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。