2013-03-07 108 views
3

可以说我有一个(嵌套)字典是这样的(注意列表值):印刷字典(JSON)人类可读

dic = {'level1': 
      {'level2':(1, 2), 
      'level3': 
        [ 
        {'level4': (1, 2)}, 
        {'level5': (1, 2)} 
        ] 
      } 
     } 

我要寻找一个合适的方法来打印这本词典,我使用json做到这一点:

import json 
print json.dumps(dic, indent=4) 

和上面的代码给我下面的输出:

{ 
    "level1": { 
     "level2": [ 
      1, 
      2 
     ], 
     "level3": [ 
      { 
       "level4": [ 
        1, 
        2 
       ] 
      }, 
      { 
       "level5": [ 
        1, 
        2 
       ] 
      } 
     ] 
    } 
} 

尽管上面的输出非常好,但仍然很难阅读,特别是如果有多个级别和更长的名称。 我也曾尝试yaml

import yaml 
print yaml.dump(dic) 

给出了一个看起来很奇怪的情况如下:

level1: 
    level2: !!python/tuple [1, 2] 
    level3: 
    - level4: !!python/tuple [1, 2] 
    - level5: !!python/tuple [1, 2] 

是否有可以产生更好的转储任何其他图书馆,我觉得下面的输出更易于阅读:

"level1" 
    |---"level2":   1, 2 
    |---"level3": 
      |---"level4": 1, 2 
      |---"level5": 1, 2 

我相信上面的代码更容易阅读,并且可能会有这样的python库。

+0

默认格式的优点是它是有效的JSON。我认为你需要推出自己的打印功能来获取你的内容。 – 2013-03-07 16:01:06

+1

您可以尝试[YAML](http://pyyaml.org/),但它不在标准库中。 – 2013-03-07 16:01:49

+0

对于YAML +1,它非常易读 – 2013-03-07 16:02:35

回答

1

这是根据activestate代码示例进行调整的。不能说它漂亮,但可能让你朝着正确的方向前进:

myDict = {'level1': 
     {'level2':(1, 2), 
      'level3': 
       [ 
       {'level4': (1, 2)}, 
       {'level5': (1, 2)}, 
       ], 
     'level6': [1,2,3], 
     'level7':{'level8': (1,2), 'level9': (1,2)} 
     } 
    } 



def prettyPrint(dictionary, ident = '', braces=1): 
    for key, value in dictionary.iteritems(): 
     if isinstance(value, dict): 
      print '%s%s%s%s' % (ident, braces*'[', key, braces*']') 
      prettyPrint(value, ident+' ', braces+1) 
     elif isinstance(value, list): 
      ndict=0 
      for v in value: 
       if isinstance(v, dict): 
        ndict += 1 
      if ndict: 
       print '%s%s' % (ident, key) 
       for e in value: 
        if isinstance(e, dict): 
         prettyPrint(e, ident+' ', braces+1) 
        else: 
         print ident+'%s : %s' %(key, e) 
      else: 
       print ident+'%s : %s' %(key, value) 
     else: 
      print ident+'%s : %s' %(key, value) 

prettyPrint(myDict) 


[level1] 
    level2 : (1, 2) 
    level3 
    level4 : (1, 2) 
    level5 : (1, 2) 
    level6 : [1, 2, 3] 
    [[level7]] 
    level8 : (1, 2) 
    level9 : (1, 2)