37 Stimmen

Der einfachste Weg, eine Liste in eine HTML-Tabelle in Python zu verwandeln?

Sagen wir, ich habe eine Liste wie diese:

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

und ich möchte damit experimentieren, diese Daten in eine HTML-Tabelle mit verschiedenen Dimensionen umzuwandeln:

one     two    three
four    five   six
seven   eight  nine

o

one    four   seven
two    five   eight
three  six    nine

o

one    two   three  four
five   six   seven  eight
nine

Gibt es eine Bibliothek, die dies behandeln kann, ohne verrückte Liste Spleißen oder verschachtelte for-Schleifen tun zu müssen? Meine Google-Suchen zeigen, dass es ein paar HTML-Bibliotheken, aber ich habe nicht die Zeit, durch jede einzelne zu gehen, um zu sehen, wenn sie Tabellen sehr gut behandeln können. Musste das schon einmal jemand tun? Wenn ja, wie haben Sie es gemacht?

53voto

Tomasz Punkte 4911

使用方法 tabellieren

from tabulate import tabulate

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

print(tabulate(table, tablefmt='html'))

Das Ergebnis ist die folgende Ausgabe.

<table>
<tbody>
<tr><td>one  </td><td>two  </td><td>three</td></tr>
<tr><td>four </td><td>five </td><td>six  </td></tr>
<tr><td>seven</td><td>eight</td><td>nine </td></tr>
</tbody>
</table>

42voto

Alex Martelli Punkte 805329

Ich würde Ihr Problem in zwei Teile zerlegen:

  • aus einer "flachen Liste" eine Liste von Teillisten erstellen, wobei die Teillisten eine bestimmte Länge haben und die Gesamtliste entweder in eine "zeilenmäßige" (Ihr erstes und drittes Beispiel) oder "spaltenmäßige" (Ihr zweites Beispiel) Reihenfolge gebracht werden kann;
  • aus einer Liste von Unterlisten mit String-Elementen eine HTML-Tabelle erstellen.

Ich denke, die beiden Aufgaben sind wirklich sehr unterschiedlich und es gibt nichts zu gewinnen (und viel zu verlieren), wenn man sie vermischt, daher wäre ich erstaunt, wenn eine gut konzipierte Bibliothek eine solche Vermischung vornimmt.

Für Punkt 1 ist der Zeilen-Dur einfach:

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

und Kolumne-major nicht so schlecht:

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

zum Beispiel ...:

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

liefert die drei gewünschten Ergebnisse (eine Liste pro Zeile, noch nicht in HTML-Form;-).

Die zweite Hälfte des Problems - Erstellen einer HTML-Tabelle aus einer Liste von Listen von Zeichenketten:

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

Wenn Sie sie als einzelne Zeichenkette erhalten möchten, anstatt sie auszudrucken, ändern Sie jede print in yield und verwenden '\n'.join(html_table(lol)) .

Jetzt haben Sie zwei einfache, nützliche, brauchbare und wiederverwendbare Bausteine - sie getrennt zu haben wird immer dann nützlich sein, wenn Sie Ihre Daten als etwas anderes als eine HTML-Tabelle darstellen wollen, und auch immer dann, wenn die Liste der Listen, die Sie als HTML-Tabelle darstellen wollen, von einer anderen Art der Erstellung stammt. Es ist einfach, sie in Ihrem Anwendungscode zusammenzufügen, aber natürlich ist es auch einfach, eine einfache "Kleberoutine" zu erstellen, z.B. indem man die yield -basierten Version von html_table und dass ein einzelnes String-Ergebnis gewünscht wird:

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

Ist dieser Baustein-Ansatz nicht viel schöner und angenehmer und auch produktiver als das Programmieren in Form von großen Klecksen...?-)

11voto

Matheus Portela Punkte 2360

Nur für die Zukunft habe ich ein kleines Python-Modul namens einfaches Tablett um eine einfache HTML-Tabellenerstellung zu ermöglichen. Sie befasst sich auch mit dem in dieser Frage beschriebenen Problem.

Die Verwendung ist so einfach wie unten beschrieben:

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

Da es keine Pakete von Drittanbietern benötigt, können Sie den Code einfach von mein Repository und verwenden Sie sie in Ihren Projekten.

7voto

Han.Oliver Punkte 467

Eine weitere Möglichkeit ist prettytable:

from prettytable import PrettyTable
pt = PrettyTable()

wenn Sie das HTML-Format erzeugen wollen:

print(pt.get_html_string())

wenn nur eine Tabelle im ASCII-Format erzeugt wird:

print(pt.get_string())

Bitte beachten Sie das offizielle Dokument: https://ptable.readthedocs.io/en/latest/tutorial.html für weitere Optionen, z. B. verschiedene Arten von Stilen aktivieren.

genießen.

2voto

Benno Punkte 5612

Nun, es gibt mehrere Templating-Bibliotheken (Genshi ist eine, die ich mag, aber es gibt viele andere).

Alternativ könnten Sie auch etwas wie folgt tun:

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X