【问题标题】:How do I display a list containing dictionaries in a pretty way?如何以漂亮的方式显示包含字典的列表?
【发布时间】:2019-11-15 15:18:54
【问题描述】:

我有将 linux 上的 multipath.conf 解析为嵌套字典的函数,字典如下所示:

[{'blacklist': [{'devnode': '"^(ram|raw|loop|fd|md|dm-|sr|scd|st)[0-9]*"'}, {'devnode': '"^hd[a-z][[0-9]*]"'}, {'devnode': '"^cciss!c[0-9]d[0-9]*"'}]}, {'defaults': [{'user_friendly_names': 'yes'}]}, {'defaults': [{'udev_dir': '/dev'}, {'polling_interval': '10'}, {'selector': '"round-robin 0"'}, {'path_grouping_policy': 'multibus'}, {'getuid_callout': '"/sbin/scsi_id -g -u -s /block/%n"'}, {'prio_callout': 'none'}, {'path_checker': 'readsector0'}, {'rr_min_io': '100'}, {'max_fds': '8192'}, {'rr_weight': 'priorities'}, {'failback': 'immediate'}, {'no_path_retry': 'fail'}, {'user_friendly_names': 'yes'}]}, {'blacklist': [{'wwid': '26353900f02796769'}, {'devnode': '"^(ram|raw|loop|fd|md|dm-|sr|scd|st)[0-9]*"'}, {'devnode': '"^hd[a-z]"'}]}, {'devices': [{'device': [{'vendor': '"COMPAQ "'}, {'product': '"HSV110 (C)COMPAQ"'}, {'path_grouping_policy': 'multibus'}, {'getuid_callout': '"/sbin/scsi_id -g -u -s /block/%n"'}, {'path_checker': 'readsector0'}, {'path_selector': '"round-robin 0"'}, {'hardware_handler': '"0"'}, {'failback': '15'}, {'rr_weight': 'priorities'}, {'no_path_retry': 'queue'}]}, {'device': [{'vendor': '"COMPAQ "'}, {'product': '"MSA1000 "'}, {'path_grouping_policy': 'multibus'}]}]}]

我需要以“漂亮的格式”再次将它拿出来,看起来像这样:

devices {
   device {
           vendor                  "COMPAQ  "
          product                 "HSV110 (C)COMPAQ"
          path_grouping_policy    multibus
          getuid_callout          "/sbin/scsi_id -g -u -s /block/%n"
          path_checker            readsector0
           path_selector           "round-robin 0"
           hardware_handler        "0"
           failback                15
           rr_weight               priorities
           no_path_retry           queue
  }
   device {
           vendor                  "COMPAQ  "
           product                 "MSA1000         "
           path_grouping_policy    multibus
   }
}
blacklist {
    devnode         "^(ram|raw|loop|fd|md|dm-|sr|scd|st)[0-9]*"
    devnode         "^hd[a-z][[0-9]*]"
    devnode         "^cciss!c[0-9]d[0-9]*"
}
and so on the order does not really matter... but the indentations are important to have some 

我已经尝试使用递归函数“很好地”将其打印出来,但问题是它是嵌套的……知道如何打印这本字典吗?

【问题讨论】:

  • 我想出的部分解决方案是:`def pretty(d, indent=0): for i in d: for key, value in i.items(): print('\t' * indent + str(key) + ' {') if isinstance(value, list): for item in value: if isinstance(item, dict): for key_1, value_1 in item.items(): print('\t' * (indent + 1) + str(key_1) + 4 * ' ' + str(value_1)) print('}') ` 但这并不能解决所有问题...

标签: python linux list dictionary printing


【解决方案1】:

你可以使用pprint:

import pprint
a = [{'blacklist': [{'devnode': '"^(ram|raw|loop|fd|md|dm-|sr|scd|st)[0-9]*"'}, {'devnode': '"^hd[a-z][[0-9]*]"'}, {'devnode': '"^cciss!c[0-9]d[0-9]*"'}]}, {'defaults': [{'user_friendly_names': 'yes'}]}, {'defaults': [{'udev_dir': '/dev'}, {'polling_interval': '10'}, {'selector': '"round-robin 0"'}, {'path_grouping_policy': 'multibus'}, {'getuid_callout': '"/sbin/scsi_id -g -u -s /block/%n"'}, {'prio_callout': 'none'}, {'path_checker': 'readsector0'}, {'rr_min_io': '100'}, {'max_fds': '8192'}, {'rr_weight': 'priorities'}, {'failback': 'immediate'}, {'no_path_retry': 'fail'}, {'user_friendly_names': 'yes'}]}, {'blacklist': [{'wwid': '26353900f02796769'}, {'devnode': '"^(ram|raw|loop|fd|md|dm-|sr|scd|st)[0-9]*"'}, {'devnode': '"^hd[a-z]"'}]}, {'devices': [{'device': [{'vendor': '"COMPAQ "'}, {'product': '"HSV110 (C)COMPAQ"'}, {'path_grouping_policy': 'multibus'}, {'getuid_callout': '"/sbin/scsi_id -g -u -s /block/%n"'}, {'path_checker': 'readsector0'}, {'path_selector': '"round-robin 0"'}, {'hardware_handler': '"0"'}, {'failback': '15'}, {'rr_weight': 'priorities'}, {'no_path_retry': 'queue'}]}, {'device': [{'vendor': '"COMPAQ "'}, {'product': '"MSA1000 "'}, {'path_grouping_policy': 'multibus'}]}]}]
pprint.pprint(a)

给出输出:

[{'blacklist': [{'devnode': '"^(ram|raw|loop|fd|md|dm-|sr|scd|st)[0-9]*"'},
                {'devnode': '"^hd[a-z][[0-9]*]"'},
                {'devnode': '"^cciss!c[0-9]d[0-9]*"'}]},
 {'defaults': [{'user_friendly_names': 'yes'}]},
 {'defaults': [{'udev_dir': '/dev'},
               {'polling_interval': '10'},
               {'selector': '"round-robin 0"'},
               {'path_grouping_policy': 'multibus'},
               {'getuid_callout': '"/sbin/scsi_id -g -u -s /block/%n"'},
               {'prio_callout': 'none'},
               {'path_checker': 'readsector0'},
               {'rr_min_io': '100'},
               {'max_fds': '8192'},
               {'rr_weight': 'priorities'},
               {'failback': 'immediate'},
               {'no_path_retry': 'fail'},
               {'user_friendly_names': 'yes'}]},
 {'blacklist': [{'wwid': '26353900f02796769'},
                {'devnode': '"^(ram|raw|loop|fd|md|dm-|sr|scd|st)[0-9]*"'},
                {'devnode': '"^hd[a-z]"'}]},
 {'devices': [{'device': [{'vendor': '"COMPAQ "'},
                          {'product': '"HSV110 (C)COMPAQ"'},
                          {'path_grouping_policy': 'multibus'},
                          {'getuid_callout': '"/sbin/scsi_id -g -u -s '
                                             '/block/%n"'},
                          {'path_checker': 'readsector0'},
                          {'path_selector': '"round-robin 0"'},
                          {'hardware_handler': '"0"'},
                          {'failback': '15'},
                          {'rr_weight': 'priorities'},
                          {'no_path_retry': 'queue'}]},
              {'device': [{'vendor': '"COMPAQ "'},
                          {'product': '"MSA1000 "'},
                          {'path_grouping_policy': 'multibus'}]}]}]

或者,您可以使用YAML:

import yaml
print(yaml.dump(a))

输出:

- blacklist:
  - devnode: '"^(ram|raw|loop|fd|md|dm-|sr|scd|st)[0-9]*"'
  - devnode: '"^hd[a-z][[0-9]*]"'
  - devnode: '"^cciss!c[0-9]d[0-9]*"'
- defaults:
  - user_friendly_names: 'yes'
- defaults:
  - udev_dir: /dev
  - polling_interval: '10'
  - selector: '"round-robin 0"'
  - path_grouping_policy: multibus
  - getuid_callout: '"/sbin/scsi_id -g -u -s /block/%n"'
  - prio_callout: none
  - path_checker: readsector0
  - rr_min_io: '100'
  - max_fds: '8192'
  - rr_weight: priorities
  - failback: immediate
  - no_path_retry: fail
  - user_friendly_names: 'yes'
- blacklist:
  - wwid: 26353900f02796769
  - devnode: '"^(ram|raw|loop|fd|md|dm-|sr|scd|st)[0-9]*"'
  - devnode: '"^hd[a-z]"'
- devices:
  - device:
    - vendor: '"COMPAQ "'
    - product: '"HSV110 (C)COMPAQ"'
    - path_grouping_policy: multibus
    - getuid_callout: '"/sbin/scsi_id -g -u -s /block/%n"'
    - path_checker: readsector0
    - path_selector: '"round-robin 0"'
    - hardware_handler: '"0"'
    - failback: '15'
    - rr_weight: priorities
    - no_path_retry: queue
  - device:
    - vendor: '"COMPAQ "'
    - product: '"MSA1000 "'
    - path_grouping_policy: multibus

【讨论】:

  • 我已经看过pprint了,但是输出和我说的不一样...
【解决方案2】:

这是为我做的,但它不是通用的,如果有人可以帮助将它重写为递归,那将对我有很大帮助!

def pretty(d, indent=0):
for i in d:
    for key, value in i.items():
        print('\t' * indent + str(key) + ' {')
        if isinstance(value, list):
            for item in value:
                if isinstance(item, dict):
                    for key_1, value_1 in item.items():
                        if isinstance(value_1, list):
                            print('\t' * (indent + 2) + str(key_1) + ' {')
                            for x in value_1:
                                for key_2, value_2 in x.items():
                                    print('\t' * (indent + 3) + str(key_2) + 4 * ' ' + str(value_2))
                            print('\t' * (indent + 2) + '}')
                        else:
                            print('\t' * (indent + 1) + str(key_1) + 4 * ' ' + str(value_1))

        print('}')

【讨论】:

    猜你喜欢
    • 2014-10-16
    • 2020-10-23
    • 2013-04-21
    • 2016-11-26
    • 2020-07-23
    • 2014-03-31
    • 2022-08-18
    • 2019-09-26
    • 1970-01-01
    相关资源
    最近更新 更多