2012-06-09 57 views
15

我在使用Python生成html文檔時遇到了一些問題。我正在嘗試創建一個目錄樹的HTML列表。這是我到目前爲止有:如何使用Python生成html目錄列表

def list_files(startpath): 
    for root, dirs, files in os.walk(startpath): 
     level = root.replace(startpath, '').count(os.sep) 
     if level <= 1: 
      print('<li>{}<ul>'.format(os.path.basename(root))) 
     else: 
      print('<li>{}'.format(os.path.basename(root))) 
     for f in files: 
      last_file = len(files)-1 
      if f == files[last_file]: 
       print('<li>{}</li></ul>'.format(f)) 
      elif f == files[0] and level-1 > 0: 
       print('<ul><li>{}</li>'.format(f)) 
      else: 
       print('<li>{}</li>'.format(f)) 
    print('</li></ul>') 

它似乎運作良好,如果只有根目錄,子目錄和文件的一個級別。但是,添加另一層次的子目錄會導致出現問題(因爲在我認爲的結尾處,關閉標記輸入的次數不夠)。但是我很難在腦海中找到它。

如果不能這樣做,有沒有更簡單的方法來做到這一點?我正在使用Flask,但我對模板很缺乏經驗,所以我可能會錯過一些東西。

+3

[燒瓶-自動變址(http://packages.python.org/Flask-AutoIndex/) – jfs

回答

34

您可以將目錄樹生成及其渲染分離爲html。

要生成你可以使用一個簡單的遞歸函數的樹:

def make_tree(path): 
    tree = dict(name=os.path.basename(path), children=[]) 
    try: lst = os.listdir(path) 
    except OSError: 
     pass #ignore errors 
    else: 
     for name in lst: 
      fn = os.path.join(path, name) 
      if os.path.isdir(fn): 
       tree['children'].append(make_tree(fn)) 
      else: 
       tree['children'].append(dict(name=name)) 
    return tree 

,以使其爲HTML,你可以使用的Jinja2的循環recursive功能:

<!doctype html> 
<title>Path: {{ tree.name }}</title> 
<h1>{{ tree.name }}</h1> 
<ul> 
{%- for item in tree.children recursive %} 
    <li>{{ item.name }} 
    {%- if item.children -%} 
     <ul>{{ loop(item.children) }}</ul> 
    {%- endif %}</li> 
{%- endfor %} 
</ul> 

把HTML到templates/dirtree.html文件。 要測試,運行下面的代碼和訪問http://localhost:8888/

import os 
from flask import Flask, render_template 

app = Flask(__name__) 

@app.route('/') 
def dirtree(): 
    path = os.path.expanduser(u'~') 
    return render_template('dirtree.html', tree=make_tree(path)) 

if __name__=="__main__": 
    app.run(host='localhost', port=8888, debug=True) 
+0

這工作完全。 – bem3ry

+0

偉大的解決方案。謝謝。 – under5hell

+0

值得注意的是,如果您不熟悉Jinja,'dirtree.html'模板文件需要位於名爲'templates'的目錄中。 –