utamaro’s blog

誰かの役に立つ情報を発信するブログ

pythonを使ってディレクトリのツリー構造をjsonで表示してみた

何に使えるのかわかりませんが、ディレクトリのツリー構造をjsonで表現するプログラムを紹介します。

サンプルとして用意したティレクトリ構造が以下のものです。

このディレクトリのtreeをjsonにしたいと思います。

dir/
├── dir2
│   ├── file1
│   └── file2
└── dir3
    └── dir4
        ├── file3
        └── file4

プログラム

jsonファイルを作成して保存するまで書こうと考えたのですが、printで表示してもいいかなと。

jsonが表示されれば良いのですし。

def file_tree(path='.'):
    dirs = os.listdir(path)
    buf_child = []
    root = {
        'path': path,
        'name': '',
        'child': buf_child,
    }
    for dir in dirs:
        dir_path = os.path.join(path, dir)
        if os.path.isdir(dir_path):
            # dirの場合
            child = file_tree(dir_path)
            child['name'] = dir
            buf_child.append(child)
        else:
            # dir以外
            buf_child.append({
                'path': dir_path,
                'name': dir,
                'child': [],
            })
    return root


if __name__ == '__main__':
    result = file_tree()
    print(json.dumps(result, indent=4))

再帰的に検索しています。

自分の実装があっていれば、深さ優先探索をしているはずです。

ディレクトリの場合は、もう一度検索して、ファイルのときはchildにデータを入れています。

モノがなくなったら、その結果をjsonにしてprintしてます。

実行結果

これをどうやって使うのか、何に使えるのか、まったく考えていません。

再帰的に検索するプログラムを突発的に作りたくなったのと、直近でtreeコマンドを使ってたのでなんとなく作ってみました。

きっと、このjsonをloadsで読み込んで、再帰的に表示するといい感じにコンソールに表示できるはずです。

{
    "path": "./dir",
    "name": "",
    "child": [
        {
            "path": "./dir/dir2",
            "name": "dir2",
            "child": [
                {
                    "path": "./dir/dir2/file1",
                    "name": "file1",
                    "child": []
                },
                {
                    "path": "./dir/dir2/file2",
                    "name": "file2",
                    "child": []
                }
            ]
        },
        {
            "path": "./dir/dir3",
            "name": "dir3",
            "child": [
                {
                    "path": "./dir/dir3/dir4",
                    "name": "dir4",
                    "child": [
                        {
                            "path": "./dir/dir3/dir4/file3",
                            "name": "file3",
                            "child": []
                        },
                        {
                            "path": "./dir/dir3/dir4/file4",
                            "name": "file4",
                            "child": []
                        }
                    ]
                }
            ]
        }
    ]
}