2017-02-22 23 views
0

Я выполняю вычисления по сложному запросу и становлюсь ниже словаря в качестве окончательного вывода и теперь хочу напечатать этот dict в формате html без имен столбцов hardcoding, поскольку он является динамическим.Python dynamic dictionary + print html output

Если столбец нет, то добавьте 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) 

Этот код ошибки из БЭК по умолчанию Словаре внутри словаря, который должен быть удален.

+0

Если вы получили сообщение об ошибке, вы должны показать полное сообщение об ошибке.В любом случае, помните, что dict не сохраняет порядок, и я не думаю, что вам нужны 'defaultdic (dict, ...)' –

ответ

2

как об использовании pandas он делает все job для вас

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

этого результата в таблице

enter image description here

.T использовать транспонировать таблицу

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

и привести к

enter image description here


без панд, их я бы, как этот

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

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

этот результат в

enter image description here


Одна из проблем с вашим кодом, что вы не забираете значения в правильном порядке, один частичное решение для этого является

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

Если вы не хотите жестко кодировать имена столбцов, но получите их из данных, вы можете сделать это

>>> {k for v in data.values() for k in v } 
{'C', 'IOS', 'Solaris', 'Ubuntu', 'Microsoft', 'Go'} 
>>> 

о свой вопрос в комментариях, да, можно и очень легко с sum, как, например,

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

просто поиграйте с ним, пока вы не получите результат желания, и проверка documentation, чтобы вы знали все игрушки, которые у него есть

+0

Вау, 'na_rep = '0'' автоматически преобразует пустой dicts в 0! Чистый выход, несмотря на плохой вход ... Nice –

+0

Использование pandas отлично выглядит! Можно ли добавить столбец «Всего» в таблице с помощью pandas, или мне нужно вычислить себя перед передачей значений? –

+0

@VinodHC yes, check update – Copperfield