読者です 読者をやめる 読者になる 読者になる

PyYAMLで改行含む文字列の出力結果を変えたい(`|` を使いたい)

はじめに

例えば、以下の様なyamlがあった時に、

# sample.yaml
article:
  title:
    hello
  body: |
    Hello.
    This is my first posting.
    blah blah blah.

ただただyaml.loadしたあとにyaml.dumpするだけのコードで変換すると、以下のような結果になってしまう。

article: {body: 'Hello.

    This is my first posting.

    blah blah blah.

    ', title: hello}

この時のコードは以下のようなもの。

import yaml
import sys

data = yaml.load(sys.stdin)
yaml.dump(data, sys.stdout)

元と同じような形に | を使った状態で出力したい

| を使った状態で出力したい

以下のようにrepreasenterを変えてあげれば出来なくもない。

import yaml
import sys


def _represent_str(dumper, instance):
    if "\n" in instance:
        return dumper.represent_scalar('tag:yaml.org,2002:str', instance, style='|')
    else:
        return dumper.represent_scalar('tag:yaml.org,2002:str', instance)

yaml.add_representer(str, _represent_str)

data = yaml.load(sys.stdin)
yaml.dump(data, sys.stdout)

結果

article:
  body: |
    Hello.
    This is my first posting.
    blah blah blah.
  title: hello