如何将目录树输出为 HTML?
Posted
技术标签:
【中文标题】如何将目录树输出为 HTML?【英文标题】:How to output a directory tree as HTML? 【发布时间】:2011-11-16 09:04:54 【问题描述】:这是我目前所得到的:
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>')
这给了我一个目录列表和它们下面的所有文件,但我仍然不知道如何拆分目录路径以便它也嵌套。
【问题讨论】:
【参考方案1】: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>')
【讨论】:
【参考方案2】: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
但是,正如其他人所提到的,为每个(子)文件夹调用的手工递归解决方案可能会简化您的任务。
【讨论】:
【参考方案3】:你需要递归。作为起点:
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(".")
【讨论】:
【参考方案4】:如果您关心层次结构,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)
【讨论】:
以上是关于如何将目录树输出为 HTML?的主要内容,如果未能解决你的问题,请参考以下文章