Python

2012-06-09 9 views
15

kullanarak html dizin listesi nasıl oluşturulur Bir html belgesi oluşturmak için Python kullanarak bazı sorunlar yaşıyorum. Bir dizin ağacının bir HTML listesi oluşturmaya çalışıyorum. Sadece kök dizini, alt dizinleri ve dosyaları bir seviye varsa iyi iş gibi görünüyorPython

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

: Bu defa ne var. Bununla birlikte, başka bir alt dizin düzeyi eklemek sorunlara neden olur (çünkü yakın etiket, sanırım sonunda yeterli zaman girmez). Ama kafamı zorlamak için zor bir zaman geçiriyorum.

Bu şekilde yapılamıyorsa, bunu yapmanın daha kolay bir yolu var mı? Flask kullanıyorum ama şablonlarla çok tecrübesizim, belki de bir şeyleri özlüyorum.

+3

[şişesi-autoindex] (http://packages.python.org/Flask-AutoIndex/) – jfs

cevap

34

Dizin ağacı oluşturmayı ve bunun oluşturulmasını html olarak ayırabilirsiniz.

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

templates/dirtree.html dosyasına html koyun:

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 

Eğer jinja2 en döngü recursive özelliğini kullanabilirsiniz html olarak oluşturması için:

basit bir özyinelemeli işlevi kullanabilirsiniz ağacını oluşturmak için. test etmek için, aşağıdaki kodu çalıştırın ve http://localhost:8888/ ziyaret edin:

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

Bu mükemmel çalışıyor. – bem3ry

+0

mükemmel çözüm. Teşekkürler. – under5hell

+0

Jinja'ya aşina değilseniz, 'dirtree.html' şablon dosyasının' templates' adlı bir dizinde olması gerekir. –