Самый простой способ превратить список в таблицу HTML в python?

скажет, что у меня есть список:

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

и я хочу поэкспериментировать с превращением этих данных в таблицу HTML различных размеров:

one     two    three
four    five   six
seven   eight  nine

или

one    four   seven
two    five   eight
three  six    nine

или

one    two   three  four
five   six   seven  eight
nine

Есть ли библиотека, которая может справиться с этим без необходимости сумасшедшего сплайсинга списка или вложенного для циклов? Мои поисковые запросы Google показывают, что есть несколько библиотек HTML, но у меня нет времени, чтобы пройти через каждый, чтобы увидеть, могут ли они хорошо обрабатывать таблицы. Кто-нибудь когда-нибудь должен был это сделать? Если да, то как вы это сделали?

Ответ 1

Я бы разложил вашу проблему на две части:

  • учитывая "плоский список", создайте список подписок, в которых подсписки имеют заданную длину, а общий список можно ввести либо в "основной порядок" (ваш первый и третий пример), либо "майор столбца", (ваш второй пример);
  • с учетом списка подписок со строковыми элементами, выведите из него таблицу HTML.

Я думаю, что две задачи действительно очень разные, и нет ничего, что можно было бы (и многое потерять) в том, чтобы их заманивать, поэтому я был бы удивлен, если бы какая-нибудь хорошо продуманная библиотека делала такие махинации.

Для точки 1 строка-майор проста:

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

и майор столбца не так плохо:

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

например...:

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

выводит ваши три желаемых результата (один список в строке, а не в HTML-форме; -).

Вторая половина проблемы - создайте таблицу HTML из списка списков строк:

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

Если вы хотите получить его как одну строку, а не распечатать, измените каждый print на yield и используйте '\n'.join(html_table(lol)).

Теперь у вас есть два простых, полезных, годных к употреблению и многоразовых строительных блоков - их использование будет полезно, когда вы хотите представить свои данные как угодно, но HTML-таблицу, а также всякий раз, когда список списков поскольку HTML-таблица исходит из любого другого способа ее создания. Объединение их легко сделать в коде приложения, но, конечно же, легко выполнить простую "процедуру склеивания", например, предполагая версию html_table на основе yield и что требуется один строковый результат:

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

Не подходит ли этот подход к строительным блокам еще лучше и приятнее, а также более продуктивен, чем программирование с точки зрения больших капель объединенных клея...? -)

Ответ 2

Просто для дальнейшего использования, я реализовал небольшой модуль Python под названием simpletable, чтобы обеспечить простую генерацию HTML-таблицы. Это также относится к проблеме, описанной в этом вопросе.

Использование так же просто, как показано ниже:

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

Поскольку для этого не требуются сторонние пакеты, вы можете просто получить код из моего хранилища и использовать его в своих проектах.

Ответ 3

Используйте табуляцию

from tabulate import tabulate

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

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

Который производит следующий вывод.

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

Ответ 4

Ну, есть несколько библиотек шаблонов (Genshi - один из них мне нравится, но есть много других).

В качестве альтернативы вы можете сделать что-то вроде:

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

Ответ 5

Возможно, манипулировать шаблоном проще для кодов игрушек, = 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)

Ответ 6

Хотя на этот вопрос уже был дан ответ, здесь есть другое решение с использованием numpy и pandas DataFrame. Поскольку в настоящее время многие люди интересуются наукой о данных, я подумал, что решить эту проблему с помощью панд будет весело:

РЕШЕНИЕ GITHUB:
Я сделал свое решение доступным в моем репозитории GitHub, которое вы также можете запускать и изучать в Google Colab Laboratory (я настоятельно рекомендую это).

пользовательская функция (generate_html_with_table()), которую я здесь использовал, доступна в этом блокноте Jupyter.

РЕШЕНИЕ:
Чтобы получить решение, выполните следующее:

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)

OUTPUT:

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

Ответ 7

другой выбор вполне приемлем:

from prettytable import PrettyTable
pt = PrettyTable()

если вы хотите создать HTML-формат:

print(pt.get_html_string())

если только создать таблицу формата ascii:

print(pt.get_string())

Пожалуйста, обратитесь к официальному документу: https://ptable.readthedocs.io/en/latest/tutorial.html для получения дополнительной информации, например, для включения различных стилей.

наслаждаться.