Najprostszy sposób na przekształcenie listy w tabelę HTML w Pythonie?

Powiedzmy, że mam taką listę:

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

I chcę poeksperymentować z przekształcaniem tych danych w tabelę HTML o 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 wykonywania splicingu crazy list lub zagnieżdżania pętli? Moje wyszukiwania Google ujawniają, że istnieje kilka bibliotek HTML, ale nie mam czasu, aby przejść przez każdą z nich, aby sprawdzić, czy mogą obsługiwać tabele bardzo dobrze. Czy ktoś kiedyś musiał to robić? Jeśli tak, to jak to zrobiłeś?

Author: priestc, 2009-09-25

5 answers

Rozłożyłbym twój problem na dwie części:

    W przypadku, gdy podlisty mają określoną długość, lista ogólna może być zapisana w kolejności "wiersz major" (pierwszy i trzeci przykład) lub" kolumna major " (drugi przykład);
  • biorąc pod uwagę listę sublist z elementami string, wytworzy z niej tabelę HTML.

Myślę, że te dwa zadania są naprawdę bardzo różne i nie ma nic do zyskania (i wiele do przegrać) w mushing je, więc byłbym zdziwiony, gdyby jakaś dobrze zaprojektowana biblioteka zrobił takie mushing.

Dla punktu 1 wiersz-dur jest prosty:

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

I Kolumna-major nie taka zła:

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

Generuje trzy pożądane wyniki (jedna lista w wierszu, jeszcze nie w formie HTML;-).

Druga połowa problemu -- Tworzenie tabeli HTML z listy list łańcuchó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 uzyskać go jako pojedynczy ciąg znaków zamiast wydrukować, Zmień każdy print na yield i użyj '\n'.join(html_table(lol)).

Teraz masz dwa proste, użyteczne, użyteczne i wielokrotnego użytku bloki konstrukcyjne - oddzielenie ich przyda się, gdy chcesz przedstawić swoje dane jako cokolwiek poza tabelą HTML, a także gdy lista list do przedstawienia jako tabela HTML pochodzi z dowolnego innego sposobu jej budowania. Złożenie ich razem jest łatwe do wykonania w kodzie aplikacji, ale oczywiście łatwo jest również wykonać prostą "procedurę klejenia", np., zakładając, że wersja yield oparta na html_table i że pożądany jest pojedynczy wynik ciągu znaków:

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

Czy to podejście do budowania klocków nie jest naprawdę ładniejsze i przyjemniejsze, a także bardziej produktywne niż programowanie w kategoriach dużych plam zmasakrowanego kleju...?-)

 27
Author: Alex Martelli,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-09-25 14:35:07

Na przyszłość zaimplementowałem mały moduł Pythona o nazwie simpletable , aby zapewnić łatwe generowanie tabeli HTML. Zajmuje się również zagadnieniem opisanym 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żesz po prostu pobrać kod z moje repozytorium i użyć go w swoich projektach.

 4
Author: Matheus Portela,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-08-06 14:27:49

Cóż, wokół jest kilka bibliotek szablonów (Genshi jest jedną, którą lubię, ale jest wiele innych).

Alternatywnie możesz 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>'
 2
Author: Benno,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-09-25 02:33:15

Może manipulowanie szablonem jest łatwiejsze dla 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)
 0
Author: okm,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-09-25 08:03:23

Chociaż odpowiedź na to była już wcześniej, oto inne rozwiązanie za pomocą numpyi Pandy DataFrame. Ponieważ wiele osób jest obecnie zainteresowanych nauką o danych, pomyślałem, że rozwiązanie tego za pomocą pand byłoby zabawne: {]}

ROZWIĄZANIE GITHUB:
Udostępniłem moje rozwiązanie W moim repozytorium GitHub , które można również uruchamiać i eksplorować w Google Colaboratory(zdecydowanie polecam).

The custom Funkcja (generate_html_with_table()) że użyłem tutaj jest dostępny w tym Notebook Jupyter.

Rozwiązanie:
Aby uzyskać rozwiązanie, wykonaj następujące czynności:

data = ['one','two','three','four','five','six','seven','eight','nine']
columns = 4                   # Number of Columns
columns_or_rows = columns
column_name_prefix = 'Column' # Prefix for Column headers
span_axis = 1                 # Span along a row (1) or a column (0) first
showOutput = True             # Use False to suppress printing output

# Generate HTML
data_html, data_df = generate_html_with_table(data, columns_or_rows, column_name_prefix, span_axis, showOutput)

Wyjście:

HTML Generated: 

<table border="1" class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th>Column_0</th>
      <th>Column_1</th>
      <th>Column_2</th>
      <th>Column_3</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>0</th>
      <td>one</td>
      <td>two</td>
      <td>three</td>
      <td>four</td>
    </tr>
    <tr>
      <th>1</th>
      <td>five</td>
      <td>six</td>
      <td>seven</td>
      <td>eight</td>
    </tr>
    <tr>
      <th>2</th>
      <td>nine</td>
      <td></td>
      <td></td>
      <td></td>
    </tr>
  </tbody>
</table>

Code_output_with_spanning_along_a_row

 0
Author: CypherX,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-23 20:38:02