默认情况下 ruamel.yaml “规范化”诸如缩进之类的东西并删除任何多余的引号。它也默认为输出单引号,当那些是必要的,因为那些表示更简单的字符串(即只有单引号具有特殊含义,这些是区分可以解释为数字的字符串的更好/更简单的选项,而不是双引号)。
您可能错过的是,您必须使用以下参数明确告诉 round_trip_loader()
保留引号:preserve_quotes=True
import sys
import ruamel.yaml
yaml_str_1 = """\
node_js:
- "0.10"
"""
yaml_str_2 = """\
before_script:
- "cp test/config-x.js src/config.js"
"""
data = ruamel.yaml.round_trip_load(yaml_str_1, preserve_quotes=True)
ruamel.yaml.round_trip_dump(data, sys.stdout)
print('=====')
data = ruamel.yaml.round_trip_load(yaml_str_2, preserve_quotes=True)
ruamel.yaml.round_trip_dump(data, sys.stdout)
给出:
node_js:
- "0.10"
=====
before_script:
- "cp test/config-x.js src/config.js"
使用该选项,所有字符串都加载到字符串的特殊子类中,然后在加载时输出。如果您替换此类加载的值,则需要使用这些类,因为仅分配新值不会保留类型。添加:
data['before_script'][0] = type(data['before_script'][0])('ln -s xxx /usr/local/bin')
ruamel.yaml.round_trip_dump(data, sys.stdout)
给出:
before_script:
- "ln -s xxx /usr/local/bin"
(那种类型恰好是ruamel.yaml.scalarstring.DoubleQuotedScalarString()
)