web-dev-qa-db-ja.com

リストをPythonでHTMLテーブルに変換する最も簡単な方法は?

次のようなリストがあるとしましょう:

['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ループを必要とせずにこれを処理できるライブラリはありますか?私のグーグル検索は、いくつかのHTMLライブラリがあることを明らかにしましたが、それらがテーブルを非常にうまく処理できるかどうかを確認するために、それぞれを調べる時間はありません。誰かがこれをしなければならなかったことがありますか?もしそうなら、あなたはそれをどのように行いましたか?

15
priestc

私はあなたの問題を2つの部分に分解します:

  • 「フラットリスト」を指定すると、サブリストが指定された長さのサブリストのリストが生成され、リスト全体が「行メジャー」の順序(最初と3番目の例)または「列メジャー」(2番目の例)例);
  • 文字列アイテムを含むサブリストのリストが与えられると、それからHTMLテーブルを生成します。

2つのタスクは本当に非常に異なっており、それらをマッシュアップすることで得るもの(そして失うもの)は何もないので、うまく設計されたライブラリーがそのようなマッシュを行ったとしたら、私は驚きます。

ポイント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
_

3つの望ましい結果が生成されます(行ごとに1つのリスト、まだ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>'
_

印刷するのではなく単一の文字列として取得する場合は、各printyieldに変更し、'\n'.join(html_table(lol))を使用します。

これで、2つのシンプルで便利な、使用可能な、再利用可能なビルディングブロックができました。それらを分離することは、データを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))
_

このビルディングブロックアプローチは、まとまった接着剤の大きな塊の点でプログラミングするよりも、実際に優れており、生産性が高いだけでなく...?-)

28
Alex Martelli

将来の参照のために、簡単なHTMLテーブルの生成を提供するために、小さなPython(simpletableというモジュール)を実装しました。この質問で説明されている問題を扱います。

使い方は以下のように簡単です:

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

サードパーティのパッケージを必要としないため、コードを my repository から取得し、プロジェクトで使用できます。

6
Matheus Portela

tabulate を使用します

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

周りにはいくつかのテンプレートライブラリがあります(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>'
2
Benno

これは以前に回答されていますが、ここではnumpypandas DataFrame。今日多くの人がデータサイエンスに興味を持っているので、pandasを使用してこれを解決するのは楽しいだろうと思いました:

ギブソリューション:
ソリューションmy 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>

code_output_with_spanning_along_a_row

0
CypherX

たぶん、テンプレートを操作することは、おもちゃのコードにとっては簡単です、= 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
okm

別の選択肢はかなり良いです:

from prettytable import PrettyTable
pt = PrettyTable()

hTML形式を生成する場合:

print(pt.get_html_string())

aSCII形式のテーブルのみを生成する場合:

print(pt.get_string())

plsは公式ドキュメントを参照します: https://ptable.readthedocs.io/en/latest/tutorial.html オプションの詳細については、たとえば、さまざまな種類のスタイルを有効にします。

楽しい。

0
hanleilei