Как создать список каталогов html с помощью Python

У меня возникли некоторые проблемы с использованием Python для создания HTML-документа. Я пытаюсь создать 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, но я не очень разбираюсь в шаблонах, поэтому, возможно, я что-то упустил.

 jfs09 июн. 2012 г., 15:51

Ответы на вопрос(1)

Решение Вопроса

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, вы можете использовать цикл jinja2recursive особенность:

<!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)
 bem3ry09 июн. 2012 г., 19:13
Это работает отлично.
 16 июн. 2017 г., 00:50
@ HEADLESS_0NE: Я уже упоминал, куда явно помещать dirtree.html.
 30 мая 2017 г., 16:15
Стоит отметить, что если вы не знакомы с Джинджей,dirtree.html файл шаблона должен находиться в каталоге с именемtemplates.
 20 мая 2016 г., 04:35
отличное решение. Благодарю.

Ваш ответ на вопрос