33

Is there any easy way to generate such a JSON? I found os.walk() and os.listdir(), so I may do recursive descending into directories and build a python object, well, but it sounds like reinventing a wheel, maybe someone knows working code for such a task?

{
  "type": "directory",
  "name": "hello",
  "children": [
    {
      "type": "directory",
      "name": "world",
      "children": [
        {
          "type": "file",
          "name": "one.txt"
        },
        {
          "type": "file",
          "name": "two.txt"
        }
      ]
    },
    {
      "type": "file",
      "name": "README"
    }
  ]
}
Andrey Moiseev
  • 3,914
  • 7
  • 48
  • 64

3 Answers3

51

I don't think that this task is a "wheel" (so to speak). But it is something which you can easily achieve by means of the tools you mentioned:

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('.'))
Emanuele Paolini
  • 9,912
  • 3
  • 38
  • 64
26

On Linux, the command-line tool tree can be used, although it is not installed by default. The output is almost identical to that required by the OP, using the flag -J for JSON output (which can then be streamed to a file for example):

tree -J folder

On OSX, this tool can be installed via Homebrew.

Jonathan H
  • 7,591
  • 5
  • 47
  • 80
  • 1
    I think you should provide more information. Currently it is more a comment than a real answer... ;) – Badacadabra May 07 '17 at 15:59
  • 1
    This is interesting and it works. Starting a separate process and reading its output is Linux-specific and not purely Python, though. – Andrey Moiseev May 07 '17 at 19:48
  • 3
    I don't see the `-J` flag on the [man page](https://linux.die.net/man/1/tree). Is there a certain version of `tree` that has the json output? – pianoJames Apr 27 '18 at 18:00
  • this just saved me a ton of time (angularJS + gulp migration to webpack), thank you – mlg87 Jul 19 '18 at 22:29
2

I just had to do this (well, almost) so hit this page but the above doesn't recurse into subdirectories.

So this version only handles directories, not files, but you could add those.

First generate a nested 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

Secondly dump that to json using the json module.

lost
  • 2,210
  • 2
  • 20
  • 34