如何让 python ruamel 保留长字符串?

How can I make python ruaml preserve long strings as is?

我正在使用 ruamel.yaml 进行往返 load/dump,但在一些包含手工制作的字符串的文件上,我想保留它们。有时这很好,因为格式实际上很漂亮(可读性),或者 copy/paste 能力。

这是我的代码:

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有关系吗?我可以这样做,只保留某些标量吗?

你可以钩入双引号标量字符串loading/construction,你 可能必须设置 yaml.preserve_quotes,然后才能正常运行 就像折叠标量的装载机。

但是首先使用 YAML 的折叠标量要容易得多,因为 看起来很像您的输入,开箱即用。并且唯一不同的是 加载值,因为没有尾随 space(我希望不是 显着):

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

如您所见,折叠的标量转储作为输入。

如果您从 >- 中保留 -,您将在加载的数据末尾得到一个(单个)换行符。