Атрибут transform в yaml.dump не работает - PullRequest
0 голосов
/ 15 апреля 2020

Если мы хотим изменить вывод yaml.dump, мы можем использовать ключевое слово tranform. Документация: https://yaml.readthedocs.io/en/latest/example.html

Вот данные yaml:

metadata:
  name: name
  alias: alias

они хранятся в переменной x.

x = 'metadata:\n  name: name\n  alias: alias\n'

def tr(s):
    return s.replace('\n', '\n    ')  # Want 4 space at each new line

from ruamel.yaml import YAML
from ruamel.yaml.compat import StringIO

yaml = YAML(typ="safe")
yaml.default_flow_style = False
stream = StringIO()

obj = yaml.load(x)
yaml.dump(obj, stream, transform=tr)
print(stream.getvalue())

При работе выше python script, Получил эту ошибку: TypeError: требуется байтоподобный объект, а не 'str'

Ожидаемый вывод:

    metadata:
      name: name
      alias: alias

Примечание: Еще 4 пробела добавляются в каждой строке

Версия Подробности настройки:

Python: 3.7
ruamel.yaml: 0.15.88

1 Ответ

0 голосов
/ 16 апреля 2020

Ну, я получил ответ сейчас. Есть некоторые проблемы только с StringIO, потому что YAML () всегда устанавливает кодировку в utf-8 (и allow_unicode = True). Изменение использования io ничего не приносит. Если вы хотите написать в StringIO в 2.7, вам нужно отключить кодировку utf-8:

т.е.

yaml = YAML(typ="safe")
yaml.default_flow_style = False
stream = StringIO()
yaml.encoding = None

Для получения дополнительной информации посетите этот билет: https://sourceforge.net/p/ruamel-yaml/tickets/271/

...