디렉토리 구조를 Json 형식으로 출력하는 방법

디렉토리 구조를 Json 형식으로 출력하는 방법

루트부터 디렉터리 구조를 출력하기 위해 Find를 사용해왔는데, 시간이 좀 걸린다는 점은 개의치 않습니다. 내 문제는 각 파일 경로를 반복하는 중복 정보를 줄이고 파일을 JSON 형식으로 출력하고 싶다는 것입니다.

터미널에서 실행할 수 있어야 하는데 상자 등에서 Python 파일을 만들 수 없습니다.

예를 들면 다음과 같습니다.

root
|_ fruits
|___ apple
|______images
|________ apple001.jpg
|________ apple002.jpg
|_ animals
|___ cat
|______images
|________ cat001.jpg
|________ cat002.jpg

그것은 다음과 같이 될 것입니다 ...

{"data" : [
  {
    "type": "folder",
    "name": "animals",
    "path": "/animals",
    "children": [
      {
        "type": "folder",
        "name": "cat",
        "path": "/animals/cat",
        "children": [
          {
            "type": "folder",
            "name": "images",
            "path": "/animals/cat/images",
            "children": [
              {
                "type": "file",
                "name": "cat001.jpg",
                "path": "/animals/cat/images/cat001.jpg"
              }, {
                "type": "file",
                "name": "cat001.jpg",
                "path": "/animals/cat/images/cat002.jpg"
              }
            ]
          }
        ]
      }
    ]
  }
]}

답변1

다음은 재귀를 사용하여 원하는 패턴을 출력하는 빠른 Python 프로그램입니다. Python 2와 3에서 작동해야 합니다(비록 2에서만 테스트했지만). 첫 번째 인수는 이동할 디렉터리이거나 기본적으로 스크립트는 현재 디렉터리를 사용합니다.

#!/usr/bin/env python

import os
import errno

def path_hierarchy(path):
    hierarchy = {
        'type': 'folder',
        'name': os.path.basename(path),
        'path': path,
    }

    try:
        hierarchy['children'] = [
            path_hierarchy(os.path.join(path, contents))
            for contents in os.listdir(path)
        ]
    except OSError as e:
        if e.errno != errno.ENOTDIR:
            raise
        hierarchy['type'] = 'file'

    return hierarchy

if __name__ == '__main__':
    import json
    import sys

    try:
        directory = sys.argv[1]
    except IndexError:
        directory = "."

    print(json.dumps(path_hierarchy(directory), indent=2, sort_keys=True))

관련 정보