python - 如何以漂亮的方式显示包含词典的列表?

标签 python linux list dictionary printing

我有一个函数可以将 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 

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

最佳答案

您可以使用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

关于python - 如何以漂亮的方式显示包含词典的列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58879944/

相关文章:

Python - 从函数内部删除(从内存中删除)变量?

Python argparse 可选破折号整数参数

使用 Linux 恢复 Windows 跨磁盘 (LDM)?

c - 将功能分配给CPU

java - JComboBox 在 Java 中显示空白项

python - 是否可以在 Python 的一条语句中连接列表索引?

JavaScript/ typescript : Created Doubly-Sorted Tree from List

python - 二维线图中的垂直线伪像

Python风格问题: Support class as inner class?

c - 通过命名管道发送结构化数据 (Linux)