簡體   English   中英

python:將字典序列化為簡單的html輸出

[英]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(' ', '&nbsp').replace(',\n', ',<br>').replace('\n', '<br>')

python dict的html視圖

想象我們有這個: {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>' + '&nbsp;'*(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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM