2012-06-09 25 views
15

Tengo algunos problemas al usar Python para generar un documento html. Estoy intentando crear una lista HTML de un árbol de directorios. Esto es lo que tengo hasta ahora:Cómo generar una lista de directorio html usando 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>') 

Parece que funciona bien si sólo existe el directorio raíz, un nivel de subdirectorios y archivos. Sin embargo, agregar otro nivel de subdirectorios ocasiona problemas (porque la etiqueta de cierre no se ingresa las veces suficientes al final, creo). Pero estoy teniendo dificultades para entenderlo.

Si no se puede hacer de esta manera, ¿hay una manera más fácil de hacerlo? Estoy usando Flask pero soy muy inexperto con las plantillas así que quizás me esté perdiendo algo.

+3

[matraz de autoindex] (http://packages.python.org/Flask-AutoIndex/) – jfs

Respuesta

34

Puede separar la generación del árbol del directorio y su representación como html.

para generar el árbol se puede utilizar una función recursiva simple:

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 

para que sea como html se podría utilizar la función de bucle recursive de Jinja2:

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

Coloque el HTML en templates/dirtree.html archivo. Para probarlo, ejecute el siguiente código y visitar 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

Esto funciona perfectamente. – bem3ry

+0

gran solución. Gracias. – under5hell

+0

Merece la pena señalar si no está familiarizado con Jinja, el archivo de plantilla 'dirtree.html' debe estar en un directorio llamado' templates'. –

Cuestiones relacionadas