Самый простой способ превратить список в таблицу 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> </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 для получения дополнительной информации, например, для включения различных стилей.
наслаждаться.