2017-02-22 10 views
0

複雑なクエリを計算して最終的な出力として辞書を取得していますが、動的なので列名をハードコードしないでhtml形式で出力したいと考えています。Pythonの動的辞書+ print htmlの出力

カラムがない場合は、レポートに0を追加します。

data = {'Author1': defaultdict(<class 'dict'>, 
         {'Microsoft': 248, 
         'Ubuntu': 24, 
         'IOS': 24, 
         'Solaris': 24, 
         'C': 248}), 
'Author2': defaultdict(<class 'dict'>, 
          {'Microsoft': 38, 
          'Ubuntu': 38, 
          'IOS': 38, 
          'Go': 38, 
          'C': 38}), 
'Author3': defaultdict(<class 'dict'>, 
        {'Microsoft': 2, 
        'IOS': 2, 
        'Go': 2, 
        'C': 2})} 

出力

Name  Microsoft Ubuntu IOS Go Solaris C 
Author1  248  24 24 0 24  248 
Author2  38  38 38 38 0  38 
Author3  2   0  2 2 0  2 

コード:削除する必要があります辞書、内部のデフォルトの辞書の

html = '<table><tr><th>' + '</th><th>'.join(data.keys()) + '</th></tr>' 

for row in zip(*data.values()): 
    html += '<tr><td>' + '</td><td>'.join(row) + '</td></tr>' 

html += '</table>' 

print(html) 

このコードのエラーアウトBEC。

+0

エラーが発生した場合は、完全なエラーメッセージを表示する必要があります。とにかく、dictは順序を保持しておらず、あなたが必要とするのは 'defaultdic(dict、...)'ではないと覚えておいてください。 –

答えて

2

pandasを使用する方法についてそれはありませんどのようにすべての

enter image description here

使用.Tがテーブルを転置するには、この表では、あなたが

import pandas 
df = pandas.DataFrame.from_dict(data) 
html = """<!DOCTYPE html> 
<html> 
    <body> 
{body} 
    </body> 
</html> 
""" 
with open("test.html","w") as file: 
    file.write(html.format(body=df.to_html(na_rep="0"))) 

この結果に対してjob

with open("test2.html","w") as file: 
    file.write(html.format(body=df.T.to_html(na_rep="0"))) 

私は最初にこの

html = """<!DOCTYPE html> 
<html> 
    <body> 
{body} 
    </body> 
</html> 
""" 

table=""" 
<table border="1" class="dataframe"> 
    <thead> 
{thead} 
    </thead> 
    <tbody> 
{tbody} 
    </tbody> 
</table> 
""" 

thead=""" 
<tr style="text-align: right;"> 
{th} 
</tr> 
""" 
th="""<th>{}</th>\n""" 
td="""<td>{}</td>\n""" 
tr="""<tr>{}</tr>\n""" 

def manual_table(data, colums): 
    head = thead.format(th= "".join(map(th.format,["Name"]+colums))) 
    pieces=[] 
    for autor, value in data.items(): 
     temp = [autor] 
     temp.extend(value.get(c,0) for c in colums) 
     pieces.append(tr.format("".join(td.format(x) for x in temp))) 
    body = "\n".join(pieces) 
    return table.format(thead=head, tbody=body) 

colums="Microsoft Ubuntu IOS Go Solaris C".split() 

with open("test3.html","w") as file: 
    file.write(html.format(body=manual_table(data, colums))) 

のように行くだろう、パンダなし

enter image description here


でそれらを結果として、私はいくつかのテンプレートを作成するので、私は私が最後に読むことができる何かを得ますそれに応じて、テンプレートに応じて、そして私がcolums変数で指定した順序でそれらのテンプレートを埋めます。あなたのコードに問題の

enter image description here


一つで

この結果は、あなたが正しい順序で値をフェッチしていないということです、そのための1つの部分的な解決策は

colums="Microsoft Ubuntu IOS Go Solaris C".split() 
for row in data.values(): 
    table += '<tr><td>' + '</td><td>'.join(str(row.get(c,0)) for c in colums) + '</td></tr>' 
です

列の名前をハードコードしないでデータから取得する場合は、これを行うことができます。

コメント欄にあなたの質問を約0
>>> {k for v in data.values() for k in v } 
{'C', 'IOS', 'Solaris', 'Ubuntu', 'Microsoft', 'Go'} 
>>> 

、はい、できますし、ちょうどあなたが望む結果を得るまでそれで遊んで、チェック例えば

>>> df 
      Author1 Author2 Author3 
C   248.0  38.0  2.0 
Go    NaN  38.0  2.0 
IOS   24.0  38.0  2.0 
Microsoft 248.0  38.0  2.0 
Solaris  24.0  NaN  NaN 
Ubuntu  24.0  38.0  NaN 
>>> df["Total"] = df.T.sum() 
>>> df 
      Author1 Author2 Author3 Total 
C   248.0  38.0  2.0 288.0 
Go    NaN  38.0  2.0 40.0 
IOS   24.0  38.0  2.0 64.0 
Microsoft 248.0  38.0  2.0 288.0 
Solaris  24.0  NaN  NaN 24.0 
Ubuntu  24.0  38.0  NaN 62.0 

のように、sumと非常に簡単です。 documentationだからあなたはそれが持っているすべてのおもちゃを知っている

+0

うわー、 'na_rep = '0''は自動的に空のdictsを0に変換します!貧しい人々の入力にもかかわらず、クリーンな出力...ニース –

+0

パンダを使用すると素晴らしいです!パンダを使用してテーブルに「合計」列を追加することは可能ですか、それとも値を渡す前に自分自身を計算する必要がありますか? –

+0

@VinodHCはい、更新を確認する – Copperfield