2011-09-13 5 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>') 
関連する問題