Самый простой способ превратить список в таблицу 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
есть ли библиотека, которая может справиться с этим без необходимости совершать безумные список сплайсинга или вложенных циклов for? Мои поиски google показывают, что есть несколько библиотек HTML, но у меня нет времени, чтобы просмотреть каждый из них, чтобы узнать, могут ли они обрабатывать таблицы очень хорошо. Кому-нибудь приходилось это делать? Если да, то как вы это делаете?
5 ответов
Я бы разложил вашу проблему на две части:
- учитывая "плоский список", создайте список подсписков, где подсписки имеют заданную длину, и общий список может быть помещен в порядок" строка major "(ваш первый и третий пример) или" столбец major " (ваш второй пример);
- учитывая список подсписков со строковыми элементами, создайте из него таблицу 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 исходит из любого другого способа его создания. Положить их вместе легко сделайте в своем коде приложения, но, конечно, также легко сделать простую "процедуру клея", например, предполагая yield
-разрядной версии html_table
и что требуется результат одной строки:
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))
разве этот подход к строительным блокам не лучше и приятнее, а также продуктивнее, чем программирование с точки зрения больших сгустков размягченного клея...?-)
просто для справки, я реализовал небольшой модуль 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")
Так как он не требует сторонних пакетов, вы можете просто узнать код мой репозиторий и использовать его в своих проектах.
Ну, есть несколько библиотек шаблонов вокруг (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>'
возможно, манипулировать шаблоном проще для кодов игрушек, =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)
хотя на это уже был дан ответ, вот еще одно решение с помощью включает в себя и класса DataFrame панды. Поскольку в настоящее время многие люди интересуются наукой о данных, я подумал, что решение этой проблемы с помощью панд будет интересно:
РЕШЕНИЕ GITHUB:
Я сделал решение имеющиеся у мой репозиторий GitHub который вы также можете запустить и изучить в Google Colaboratory (я настоятельно рекомендуем этот.)
на пользовательская функция (generate_html_with_table()
), что я использовал вот этот Jupyter Notebook.
устранение:
Чтобы получить решение, выполните следующие действия:
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)
выход:
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>