[英]python: serialize a dictionary into a simple html output
使用app引擎 - 是的我知道所有關於django模板和其他模板引擎。
讓我說我有一個字典或一個簡單的對象,我不知道它的結構,我想將其序列化為HTML。
所以,如果我有
{'data':{'id':1,'title':'home','address':{'street':'some road','city':'anycity','postal':'somepostal'}}}
我想要的是使用列表或表格以某種形式呈現的可讀html;
data:
id:1
title:home
address:
street: some road
city: anycity
postal:somepostal
現在我知道我能做到
for key in dict.items
print dict[key]
但是,當鍵/值是字典時 - 即地址字典,它不會深入到子值並列出每個鍵,值對。
他們的python模塊是輕量級/快速的,可以很好地完成這項工作。 或者任何人都有任何他們可以粘貼的簡單代碼可能會這樣做。
解決方案這里的所有解決方案都很有 pprint無疑是打印字典的更穩定的方法,盡管它沒有返回任何接近html的東西。 雖然仍然可以打印。
我現在最終得到了這個:
def printitems(dictObj, indent=0):
p=[]
p.append('<ul>\n')
for k,v in dictObj.iteritems():
if isinstance(v, dict):
p.append('<li>'+ k+ ':')
p.append(printitems(v))
p.append('</li>')
else:
p.append('<li>'+ k+ ':'+ v+ '</li>')
p.append('</ul>\n')
return '\n'.join(p)
它將dict轉換為無序列表,現在可以了。 一些css,也許一點調整應該使它可讀。
我將獎勵寫下上述代碼的人的答案,我做了一些小的改動,因為無序列表沒有嵌套。 我希望所有人都同意所提供的許多解決方案都證明是有用的,但上面的代碼呈現了字典的真正html表示,即使是粗糙的。
pyfunc制作的示例可以很容易地修改,以生成簡單的嵌套html列表。
z = {'data':{'id':1,'title':'home','address':{'street':'some road','city':'anycity','postal':'somepostal'}}}
def printItems(dictObj, indent):
print ' '*indent + '<ul>\n'
for k,v in dictObj.iteritems():
if isinstance(v, dict):
print ' '*indent , '<li>', k, ':', '</li>'
printItems(v, indent+1)
else:
print ' '*indent , '<li>', k, ':', v, '</li>'
print ' '*indent + '</ul>\n'
printItems(z,0)
當然不是非常漂亮,但可能會在某個地方開始。 如果你想做的就是可視化數據,那么pprint模塊確實足夠好。 您可以在pprint的結果上使用“pre”標記並將其放在您的網頁上。
pprint版本看起來像這樣:
import pprint
z = {'data':{'id':1,'title':'home','address':{'street':'some road','city':'anycity','postal':'somepostal'}}}
print '<pre>', pprint.pformat(z), '</pre>'
而html輸出看起來像這樣:
{'data': {'address': {'city': 'anycity',
'postal': 'somepostal',
'street': 'some road'},
'id': 1,
'title': 'home'}}
這不是那么漂亮,但它至少以更有條理的方式顯示數據。
import pprint
pprint.pprint(yourDict)
好吧,沒有HTML,但類似於你的for/print
方法。
編輯:或使用:
niceText = pprint.pformat(yourDict)
這將為您提供與所有縮進等相同的良好輸出。現在您可以迭代行並將其格式化為HTML:
htmlLines = []
for textLine in pprint.pformat(yourDict).splitlines():
htmlLines.append('<br/>%s' % textLine) # or something even nicer
htmlText = '\n'.join(htmlLines)
看看我的實現:
def pretty_items(r, d, nametag="<strong>%s: </strong>", itemtag='<li>%s</li>',
valuetag="%s", blocktag=('<ul>', '</ul>')):
if isinstance(d, dict):
r.append(blocktag[0])
for k, v in d.iteritems():
name = nametag % k
if isinstance(v, dict) or isinstance(v, list):
r.append(itemtag % name)
pretty_items(r, v)
else:
value = valuetag % v
r.append(itemtag % (name + value))
r.append(blocktag[1])
elif isinstance(d, list):
r.append(blocktag[0])
for i in d:
if isinstance(i, dict) or isinstance(i, list):
r.append(itemtag % " - ")
pretty_items(r, i)
else:
r.append(itemtag % i)
r.append(blocktag[1])
將使用<ul>
和<li>
標簽以HTML格式輸出所有項目。 並且還可以選擇更改標簽。 然后,只需使用CSS來處理縮進。
我需要類似的東西,但也想要漂亮的打印列表,並在dict中列出。 這就是我的想法:
def format(self, obj, indent = 1):
if isinstance(obj, list):
htmls = []
for k in obj:
htmls.append(self.format(k,indent+1))
return '[<div style="margin-left: %dem">%s</div>]' % (indent, ',<br>'.join(htmls))
if isinstance(obj, dict):
htmls = []
for k,v in obj.iteritems():
htmls.append("<span style='font-style: italic; color: #888'>%s</span>: %s" % (k,self.format(v,indent+1)))
return '{<div style="margin-left: %dem">%s</div>}' % (indent, ',<br>'.join(htmls))
return str(obj)
然后,如果您在appengine上使用webapp,則可以執行以下操作:
self.response.out.write(self.format(obj))
這是輸出的一個例子:
你可以使用漂亮的打印(pprint)
或者如果你想進一步處理顯示,那么你必須自己運行dict。
請注意,代碼很粗糙,需要進行大量改進。 如果遞歸深度更高,解決方案也會使用遞歸,這很糟糕。
z = {'data':{'id':1,'title':'home','address':{'street':'some road','city':'anycity','postal':'somepostal', 'telephone':{'home':'xxx','offie':'yyy'}}}}
def printItems(dictObj, indent):
it = dictObj.iteritems()
for k,v in it:
if isinstance(v, dict):
print ' '*indent , k, ':'
printItems(v, indent+1)
else:
print ' '*indent , k, ':', v
printItems(z,0)
輸出:
data :
address :
city : anycity
postal : somepostal
street : some road
telephone :
home : xxx
offie : yyy
id : 1
title : home
這是我的簡單解決方案,它可以處理任何級別的嵌套字典。
import json
temp_text = {'decision': {'date_time': None, 'decision_type': None},
'not_received': {'date_time': '2019-04-15T19:18:43.825766'},
'received': {'date_time': None},
'rfi': {'date_time': None},
'under_review': {'date_time': None}}
dict_text_for_html = json.dumps(
temp_text, indent=4
).replace(' ', ' ').replace(',\n', ',<br>').replace('\n', '<br>')
想象我們有這個: {name: "a", children:[{name: "b", children: [] },{..},{..}]
def ConvertDictToUlLi():
jsonResult = GetSomeRecursiveDict()
def CreateHtml(DictItem, output):
output = "<li>"+DictItem["name"] if jsonResult.has_key("name") else " "
if len(DictItem["children"]) > 0:
output = output + "<ul>"
for item in DictItem["children"]:
output = output + " "+CreateHtml(item, output)+" "
output = output + "</ul>"
return output+"</li>"
result = "<ul class='tree'>"+CreateHtml(jsonResult, "")+"</ul>"
return result
上面的例子都沒有給出好的結果,所以我寫了兩個我自己的函數,為字典創建漂亮的html輸出。
def dict_to_html(dd, level=0):
"""
Convert dict to html using basic html tags
"""
import simplejson
text = ''
for k, v in dd.iteritems():
text += '<br>' + ' '*(4*level) + '<b>%s</b>: %s' % (k, dict_to_html(v, level+1) if isinstance(v, dict) else (simplejson.dumps(v) if isinstance(v, list) else v))
return text
def dict_to_html_ul(dd, level=0):
"""
Convert dict to html using ul/li tags
"""
import simplejson
text = '<ul>'
for k, v in dd.iteritems():
text += '<li><b>%s</b>: %s</li>' % (k, dict_to_html_ul(v, level+1) if isinstance(v, dict) else (simplejson.dumps(v) if isinstance(v, list) else v))
text += '</ul>'
return text
這是我支持列表的版本( labels
是字典中鍵的詳細名稱):
def render_value(value, labels):
if isinstance(value, (list, tuple)):
return render_list(value, labels)
elif isinstance(value, dict):
return render_dict(value, labels)
else:
return value
def render_list(lst, labels):
items = [
'<li>%s</li>' % render_value(value, labels)
for value in lst
]
return '\n'.join(['\n<ul>'] + items + ['</ul>\n'])
def render_dict(dct, labels):
items = []
for key, value in dct.items():
if not value: continue
key = labels.get(key, key)
value = render_value(value, labels)
items.append('<li><b>%s</b>: %s</li>' % (key, value))
return '\n'.join(['\n<ul>'] + items + ['</ul>\n'])
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.