8

我使用 PyYAML 将 python 字典输出为 YAML 格式:

import yaml
d = { 'bar': { 'foo': 'hello', 'supercalifragilisticexpialidocious': 'world' } }
print yaml.dump(d, default_flow_style=False)

输出是:

bar:
  foo: hello
  supercalifragilisticexpialidocious: world

但我想:

bar:
  foo                                : hello
  supercalifragilisticexpialidocious : world

有没有解决这个问题的简单方法,即使是次优的?

4

2 回答 2

6

好的,这就是我到目前为止的想法。

我的解决方案包括两个步骤。第一步定义了一个字典表示器,用于向键添加尾随空格。通过这一步,我在输出中获得了带引号的键。这就是为什么我添加第二步来删除所有这些引号:

import yaml
d = {'bar': {'foo': 'hello', 'supercalifragilisticexpialidocious': 'world'}}


# FIRST STEP:
#   Define a PyYAML dict representer for adding trailing spaces to keys

def dict_representer(dumper, data):
    keyWidth = max(len(k) for k in data)
    aligned = {k+' '*(keyWidth-len(k)):v for k,v in data.items()}
    return dumper.represent_mapping('tag:yaml.org,2002:map', aligned)

yaml.add_representer(dict, dict_representer)


# SECOND STEP:
#   Remove quotes in the rendered string

print(yaml.dump(d, default_flow_style=False).replace('\'', ''))
于 2012-11-09T18:31:13.373 回答
0

我为 JavaScript 找到了https://github.com/jonschlinkert/align-yaml并将其翻译为 Python

https://github.com/eevleevs/align-yaml-python

它不使用 PyYAML,直接将其应用于 YAML 输出,无需解析。

以下函数的副本:

import re

def align_yaml(str, pad=0):
    props = re.findall(r'^\s*[\S]+:', str, re.MULTILINE)
    longest = max([len(i) for i in props]) + pad
    return ''.join([i+'\n' for i in map(lambda str:
            re.sub(r'^(\s*.+?[^:#]: )\s*(.*)', lambda m:
                    m.group(1) + ''.ljust(longest - len(m.group(1)) + 1) + m.group(2),
                str, re.MULTILINE)
        , str.split('\n'))])
于 2020-01-23T08:16:42.790 回答