2012-06-09 13 views
15

Ich habe einige Probleme mit Python, um ein HTML-Dokument zu generieren. Ich versuche, eine HTML-Liste einer Verzeichnisstruktur zu erstellen. Das ist, was ich habe, so weit:Wie erstelle ich eine HTML-Verzeichnisliste mit Python

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

Es scheint gut zu funktionieren, wenn es nur das Root-Verzeichnis ist, eine Ebene der Unterverzeichnisse und Dateien. Das Hinzufügen einer anderen Ebene von Unterverzeichnissen führt jedoch zu Problemen (weil das Schließen-Tag am Ende meiner Meinung nach nicht genug eingegeben wird). Aber es fällt mir schwer, mich darum zu kümmern.

Wenn es auf diese Weise nicht möglich ist, gibt es einen einfacheren Weg? Ich benutze Flask, aber ich bin sehr unerfahren mit Vorlagen, vielleicht verpasse ich etwas.

+3

[Kolben-Autoindex] (http://packages.python.org/Flask-AutoIndex/) – jfs

Antwort

34

Sie könnten die Verzeichnisbaumgenerierung und deren Darstellung als HTML trennen.

den Baum erzeugen Sie eine einfache rekursive Funktion verwenden:

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 

Um es als html machen Sie jinja2-Schleife recursive Funktion verwenden:

<!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> 

Setzen Sie den HTML-Code in templates/dirtree.html Datei. es zu testen, führen Sie den folgenden Code und besuchen 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

Das funktioniert perfekt. – bem3ry

+0

großartige Lösung. Vielen Dank. – under5hell

+0

Bemerkenswert, wenn Sie nicht mit Jinja vertraut sind, die 'dirtree.html' Vorlagendatei muss sich in einem Verzeichnis mit dem Namen' templates' befinden. –

Verwandte Themen