如何将目录树输出为HTML?

4 投票
5 回答
3441 浏览
提问于 2025-04-17 02:13

这是我目前的进展:

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 个回答

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

不过,正如其他人提到的,手动写一个递归的解决方案,每次针对每个(子)文件夹调用它,可能会让你的任务变得简单一些。

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(".")
6

os.walk 可能不是处理文件夹层级的最佳选择。如果你想要一个更简单的方法,可以考虑使用 os.listdir 配合 os.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)

撰写回答