2009-09-25 12 views
11

powiedzmy mam listę tak:Najprostszym sposobem, aby włączyć listę do tabeli HTML w python?

['one','two','three','four','five','six','seven','eight','nine'] 

i chcę eksperymentować z włączeniem tych danych w tabeli HTML różnych wymiarach:

one  two three 
four five six 
seven eight nine 

lub

one four seven 
two five eight 
three six nine 

lub

one two three four 
five six seven eight 
nine 

Czy istnieje biblioteka, która poradzi sobie z tym bez konieczności szalonego łączenia lub zagnieżdżania się w pętli? Moje wyszukiwania w Google ujawniają, że istnieje kilka bibliotek HTML, ale nie mam czasu, aby przejść przez każdy z nich, aby sprawdzić, czy potrafią dobrze obsłużyć tabele. Czy ktokolwiek kiedykolwiek musiał to zrobić? Jeśli tak, to jak to zrobiłeś?

Odpowiedz

26

bym rozłożenia problemu na dwie części:

  • otrzymał „płaska lista”, produkują listę podlist gdzie na listach podrzędnych są dana długość i ogólna lista mogą być wprowadzane albo w kolejności "rzędu głównego" (twój pierwszy i trzeci przykład), albo "kolumny głównej" (twój drugi przykład);
  • biorąc pod uwagę listę podlisty z elementami tekstowymi, wytworzy z niej tabelę HTML.

Sądzę, że te dwa zadania są naprawdę bardzo wyraźne i nie ma nic do zyskania (i wiele do stracenia), aby je zmusić, więc byłbym zdziwiony, gdyby jakakolwiek dobrze zaprojektowana biblioteka zrobiła takie mushing.

Do pkt 1, wiersz-dur jest proste:

def row_major(alist, sublen):  
    return [alist[i:i+sublen] for i in range(0, len(alist), sublen)] 

i kolumna-major nie jest tak źle:

def col_major(alist, sublen): 
    numrows = (len(alist)+sublen-1) // sublen 
    return [alist[i::sublen] for i in range(numrows)] 

... na przykład:

L = ['one','two','three','four','five','six','seven','eight','nine'] 
for r in row_major(L, 3): print r 
print 
for r in col_major(L, 3): print r 
for r in row_major(L, 4): print r 

produkuje trzy pożądane wyniki (jedna lista na wiersz, nie w formie HTML ;-).

Druga połowa problemu - produkować tabelę HTML z listy list ciągów:

def html_table(lol): 
    print '<table>' 
    for sublist in lol: 
    print ' <tr><td>' 
    print ' </td><td>'.join(sublist) 
    print ' </td></tr>' 
    print '</table>' 

Jeśli chcesz dostać go jako pojedynczy ciąg zamiast wydrukować go, zmienić każdy print do yield i użyj '\n'.join(html_table(lol)).

Teraz masz dwa proste, użyteczne, użyteczne i wielokrotnego użytku bloki konstrukcyjne - ich oddzielne przydadzą się, gdy chcesz zaprezentować swoje dane jako wszystko, ALE tabelę HTML, a także zawsze, gdy lista list do obecny jako tabela HTML pochodzi z dowolnego innego sposobu jego budowania.Zestawiając je łatwo zrobić w kodzie aplikacji, ale oczywiście jest to również łatwe do zrobienia prostego „rutynowych klej”, na przykład zakładając yield opartych wersję html_table i że jest pożądany pojedynczy wynik ciąg:

def list_to_html_table(alist, sublength, column_major=False): 
    if column_major: 
    lol = col_major(alist, sublength) 
    else: 
    lol = row_major(alist, sublength) 
    return ''.join(html_table(lol)) 

nie Czy ten budynek bloki podejść naprawdę ładniejszy i bardziej przyjemne, jak również bardziej wydajne, niż programowanie w zakresie dużych plamy mushed-up kleju ... -?)

2

Cóż, istnieje wiele bibliotek szablonów (Genshi to taki, który lubię, ale jest wiele innych).

Ewentualnie można zrobić coś takiego:

def print_table(data, row_length): 
    print '<table>' 
    counter = 0 
    for element in data: 
     if counter % row_length == 0: 
      print '<tr>' 
     print '<td>%s</td>' % element 
     counter += 1 
     if counter % row_length == 0: 
      print '</tr>' 
    if counter % row_length != 0: 
     for i in range(0, row_length - counter % row_length): 
      print '<td>&nbsp;</td>' 
     print '</tr>' 
    print '</table>' 
+0

PO chciał uniknąć zagnieżdżenia dla pętli. Więc może być wprowadzenie do mapy (lambda) jest w porządku. – whatnick

+2

@whatnick - Czy widzisz pętlę wewnątrz pętli? Ja nie. –

+0

Tylko jedna pętla. – whatnick

0

Może manipulować szablon jest łatwiejsze w przypadku kodów zabawek = p

def get_html_tbl(seq, col_count): 
    if len(seq) % col_count: 
     seq.extend([''] * (col_count - len(seq) % col_count)) 
    tbl_template = '<table>%s</table>' % ('<tr>%s</tr>' % ('<td>%s</td>' * col_count) * (len(seq)/col_count)) 
    return tbl_template % tuple(seq) 
3

Właśnie na przyszłość, zaimplementowałem mały moduł Pythona o nazwie simpletable, aby zapewnić łatwe generowanie tabeli HTML. Dotyczy to również kwestii opisanej w tym pytaniu.

Użycie jest tak proste, jak poniżej:

import simpletable 

test_data = [str(x) for x in range(20)] 
formatted_data = simpletable.fit_data_to_columns(test_data, 5) 
table = simpletable.SimpleTable(formatted_data) 
html_page = simpletable.HTMLPage(table) 
html_page.save("test_page.html") 

Ponieważ nie wymaga pakietów innych firm, można po prostu dostać kod z my repository i używać go w swoich projektach.

Powiązane problemy