2011-09-13 38 views
3

這裏是我到目前爲止有:如何將目錄樹輸出爲HTML?

project_dir = '/my/project/dir' 
project_depth = len(project_dir.split(os.path.sep)) 

xml_files = [] 
for dirpath, dirnames, filenames in os.walk(project_dir): 
    for filename in fnmatch.filter(filenames, '*.xml'): 
     dirs = dirpath.split(os.path.sep)[project_depth:] 
     print(dirs) 
     xml_files.append(os.path.join(dirpath,filename)) 

基本上我想要做的就是吐出我的項目目錄結構與所有的XML文件作爲HTML樹(使用<ul>)。我可以通過這種方式獲取所有文件,但我似乎無法弄清楚如何將它們組織到樹中。

隨着這種os.walk的工作方式,我不知道我什麼時候進入更深層次,或者如果我還在遍歷相同的目錄。


for dirpath, dirnames, filenames in os.walk(project_dir): 
    xml_files = fnmatch.filter(filenames, '*.xml') 
    if len(xml_files) > 0: 
     out.write('<li>{0}<ul>'.format(dirpath)) 
     for f in xml_files: 
      out.write('<li>{0}</li>'.format(f)) 
     out.write('</ul></li>') 
out.write('</ul>') 

這給我目錄列表和它們下面的所有文件,但我仍然無法弄清楚如何讓它嵌套過分割的目錄路徑。

回答

5

os.walk如果您關心層次結構,可能不是最佳解決方案。更簡單的解決方案可能只是使用os.listdiros.path.isdir遞歸地遍歷樹。

import os 

def traverse(dir): 
    print '<ul>' 
    for item in os.listdir(dir): 
     print '<li>%s</li>' % item 
     fullpath = os.path.join(dir, item) 
     if os.path.isdir(fullpath): 
      traverse(fullpath) 
    print '</ul>' 

projectdir = '.' 
traverse(projectdir) 
1

您需要遞歸。作爲一個起點:

import os 

def walk(d, ident=""): 
    print "<ul>" 
    for p in os.listdir(d): 
     fullpath = os.path.join(d, p) 
     print ident, "<li>",p,"</li>" 
     if os.path.isdir(fullpath): 
      walk(fullpath, ident+" ") 
    print "</ul>" 

walk(".") 
1
import os 

tmpold=[] 
for (f, fol, fil) in os.walk("./mydir"): 
    tmp = f.split("/") 
    if len(tmp)>len(tmpold): 
     print "<ul>\n<li>" + tmp[-1] + "</li>" 
    elif len(tmp)==len(tmpold): 
     print "<li>" + tmp[-1] + "</li>" 
    else: 
     print "</ul>\n"*(1+len(tmpold)-len(tmp)) + "<ul>\n<li>" + tmp[-1] + "</li>" 
    tmpold = tmp 

然而,正如其他人所提到的,被每一個信息(子)文件夾,可以簡化您的任務手工製作的遞歸解決方案。

0
def buildtree(dir): 
    tree = [] 
    for item in os.listdir(dir): 
     path = os.path.join(dir, item) 
     if os.path.isdir(path): 
      subtree = buildtree(path) 
      if len(subtree) > 0: 
       tree.append((item,subtree)) 
     elif item.endswith('.xml'): 
      tree.append(item) 
    return tree 

def writetree(tree, fp): 
    fp.write('<ul>') 
    for n in tree: 
     fp.write('<li>') 
     if isinstance(n,tuple): 
      fp.write(n[0]) 
      writetree(n[1],fp) 
     else: 
      fp.write(n) 
     fp.write('</li>') 
    fp.write('</ul>')