2011-09-13 4 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)) 

기본적으로 내가 HTML 트리 같은 모든 XML 파일을 내 프로젝트의 디렉토리 구조를 뱉어되어 수행 할 작업 (사용 <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>') 
관련 문제