我正在使用ruamel.yaml
来修改YAML文件。我的要求是为现有密钥添加一个值,保留包括订单在内的所有其他内容。我让它工作,但看起来其他键/值的引号也在过程中被修改。
在某些情况下,双引号会转换为单引号。 E.g。
之前
node_js:
- "0.10"
后
node_js:
- '0.10'
在其他一些情况下,报价完全被删除。 E.g:
之前
before_script:
- "cp test/config-x.js src/config.js"
后
before_script:
- cp test/config-x.js src/config.js
这两种情况都出现在同一个文件中。如何阻止这种情况发生并保留原始引号?
我使用load_yaml_guess_indent()
加载,round_trip_dump()
写回来。
答案 0 :(得分:2)
默认情况下,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()
)
答案 1 :(得分:0)
int EntryPoint();
...
int main()
{
在当前版本的yaml.preserve_quotes = True
中有效。