如何将目录树输出为HTML?

4

这是我目前的结果:

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 树(使用 <ul>)的形式输出我的项目目录结构及其所有 XML 文件。我可以通过这种方式获取所有文件,但似乎无法弄清楚如何将它们组织成树形结构。 由于这种 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个回答

6

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

虽然这个问题已经过去了一段时间,但我最近需要类似的东西,tree开发者(??)使它变得非常容易。

    tree path_to_directories -H . -o output_filename.html

看起来它使用 &nbsp 等东西而不是 <ul>,但知道它有一个 HTML 选项仍然很好 :-) - mpen

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>')

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,