2016-09-13 45 views
0

我有一個腳本,將任何給定的文件夾結構變成JSON,JSTree兼容的結構。但是,子文件夾全部分組在一個孩子級別下。因此,文件夾內的文件夾被標記爲根目錄下的一個級別。我如何在JSON中維護根子/子 - 子關係?Python子文件夾結構與兒童JSON

import os, sys, json 

def all_dirs_with_subdirs(path, subdirs): 

    try: 
     path = os.path.abspath(path) 

     result = [] 
     for root, dirs, files in os.walk(path): 
      exclude = "Archive", "Test" 
      dirs[:] = [d for d in dirs if d not in exclude] 
      if all(subdir in dirs for subdir in subdirs): 
        result.append(root) 
     return result 

    except WindowsError: 
     pass 
def get_directory_listing(path): 
    try: 
     output = {} 
     output["text"] = path.decode('latin1') 
     output["type"] = "directory" 
     output["children"] = all_dirs_with_subdirs("G:\TEST", ('Maps', 'Temp')) 
     return output 

    except WindowsError: 
     pass 
with open(r'G:\JSONData.json', 'w+') as f: 
    listing = get_directory_listing("G:\TEST") 
    json.dump(listing, f) 

回答

0

因爲all_dirs_with_dubdirs你走過目錄樹,每一個有效的目錄添加到一個平面列表result你那麼唯一"children"鍵存儲你只有一個層次結構。

你想要做的就是創建一個像

{ 
    'text': 'root_dir', 
    'type': 'directory', 
    'children': [ 
    { 
     'text': 'subdir1 name', 
     'type': 'directory', 
     'children': [ 
     { 
      'text': 'subsubdir1.1 name', 
      'type': 'directory', 
      'children': [ 
      ... 
      ] 
     }, 
     ... 
     ] 
    }, 
    { 
     'text': 'subdir2 name', 
     'type': 'directory', 
     'children': [ 
     ... 
     ] 
    }, 
    ] 
} 

的結構,您可以用遞歸做到這一點相當漂亮

def is_valid_dir(path, subdirs): 
    return all(os.path.isdir(path) for subdir in subdirs) 


def all_dirs_with_subdirs(path, subdirs): 
    children = [] 

    for name in os.listdir(path): 
     subpath = os.path.join(path, name) 
     if name not in ("Archive", "Test") and os.path.isdir(subpath) and is_valid_dir(subpath, subdirs): 
      children.append({ 
       'text': name, 
       'type': 'directory', 
       'children': all_dirs_with_subdirs(subpath, subdirs) 
      }) 

    return children 
+0

我該如何才能夠顯示包含文件夾「地圖」和「溫度」的文件夾/子文件夾?您的代碼確實排除了「歸檔」和「測試」,但我正在尋找一種方法來確保只包含某些文件夾。 – Infinity8

0

你可以得到CWD的直接孩子:

next(os.walk('.'))[1] 

有了這個表達式,你可以編寫一個像這樣的遞歸遍歷函數:

def dir_to_json(dir): 
    subdirs = next(os.walk('dir'))[1] 
    if not subdirs: 
     return # Something in your base case, how are you representing this? 
    return combine_as_json(dir_to_json(os.path.join(dir, d)) for d in subdirs) 

然後,你需要做一個combine_as_json()功能彙總了您所選擇的編碼/代表性的子目錄結果。