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

さて、これが私がこれまでに思いついたものです。

私の解決策には2つのステップが含まれます。最初のステップでは、キーに末尾のスペースを追加するためのディクショナリ表現を定義します。このステップで、出力で引用符で囲まれたキーを取得します。これが、これらすべての引用符を削除するための2番目のステップを追加する理由です。

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 に答える