Как я могу заставить python ruaml сохранить длинные строки как есть? - PullRequest
1 голос
/ 06 марта 2020

Я использую ruamel.yaml для выполнения загрузки / выгрузки в оба конца, но для некоторых файлов со строками ручной работы я бы хотел сохранить их. Иногда это хорошо, потому что форматирование на самом деле симпатичное (удобочитаемость) или возможность копирования / вставки.

Вот мой код:

from ruamel.yaml import YAML
import sys
yaml = YAML()

i = """
mydict:
  command: "my_shell_script
    --firstarg
    --second
    --third
    .......
    fourth
  "
"""

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

Который выводит

mydict:
  command: 'my_shell_script --firstarg --second --third ....... fourth '

Я не хочу, чтобы это изменило эти строки. Я знаком с опцией yaml.width, но вообще не хочу ее устанавливать! (высокий или низкий).

Как сделать так, чтобы ruamel.yaml сохранил форматирование на скалярах, как это? Это как-то связано с PreservedScalarString? Могу ли я сделать это таким образом, чтобы он сохранял только определенные скаляры?

1 Ответ

0 голосов
/ 06 марта 2020

Вы можете подключиться к загрузке / построению скалярной строки в двойных кавычках, вам, вероятно, придется установить yaml.preserve_quotes, а затем вести себя как загрузчик для сложенных скаляров.

Но это гораздо проще в первую очередь используйте сложенные скаляры YAML, так как это выглядит как ваш ввод, циклические переходы из коробки. И отличается только в загруженном значении тем, что нет пробела (который, я надеюсь, не имеет значения):

import sys
import ruamel.yaml

yaml_str = """
mydict:
  command: "my_shell_script
    --firstarg
    --second
    --third
    .......
    fourth
    "
altdict:
  command: >-
    my_shell_script
    --firstarg
    --second
    --third
    .......
    fourth
"""

yaml = ruamel.yaml.YAML()
data = yaml.load(yaml_str)
for k in data:
    print(repr(data[k]['command']))
yaml.dump(data, sys.stdout)

, что дает:

'my_shell_script --firstarg --second --third ....... fourth '
'my_shell_script --firstarg --second --third ....... fourth'
mydict:
  command: 'my_shell_script --firstarg --second --third ....... fourth '
altdict:
  command: >-
    my_shell_script
    --firstarg
    --second
    --third
    .......
    fourth

Как вы можете видеть в сложенном виде скалярные дампы в качестве входных данных.

Если вы оставите - из >-, вы получите (одну) новую строку в конце ваших загруженных данных.

...