【问题标题】:How to output a directory tree as HTML?如何将目录树输出为 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>')  

这给了我一个目录列表和它们下面的所有文件,但我仍然不知道如何拆分目录路径以便它也嵌套。

【问题讨论】:

    标签: python file filesystems operating-system directory


    【解决方案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.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)
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2011-09-29
            • 1970-01-01
            • 2022-12-06
            • 1970-01-01
            • 2019-03-31
            • 2014-10-03
            相关资源
            最近更新 更多