在 ruamel.yaml 中保留引号
Preserving quotes in ruamel.yaml
我正在使用 ruamel.yaml
修改 YAML 文件。我的要求是为现有键添加一个值,保留包括订单在内的所有其他内容。我让它工作了,但看起来其他 keys/values 的引号也在这个过程中被修改了。
在某些情况下,双引号会转换为单引号。例如
之前
node_js:
- "0.10"
之后
node_js:
- '0.10'
在其他一些情况下,引号会被完全删除。例如:
之前
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()
写回。
默认情况下ruamel.yaml“规范化”诸如缩进之类的东西并删除任何多余的引号。它也默认输出单引号,当这些是必要的时,因为单引号表示更简单的字符串(即只有单引号具有特殊含义,这些是 better/simpler 选项来区分可以解释为数字的字符串而不是双引号).
您可能错过的是您明确地告诉 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"
"""
yaml = ruamel.yaml.YAML()
yaml.preserve_quotes = Truej
data = ruamel.yaml.load(yaml_str_1)
ruamel.yaml.dump(data, sys.stdout)
print('=====')
data = ruamel.yaml.load(yaml_str_2)
ruamel.yaml.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()
)
yaml.preserve_quotes = True
适用于当前版本的 ruamel.yaml
。
我正在使用 ruamel.yaml
修改 YAML 文件。我的要求是为现有键添加一个值,保留包括订单在内的所有其他内容。我让它工作了,但看起来其他 keys/values 的引号也在这个过程中被修改了。
在某些情况下,双引号会转换为单引号。例如
之前
node_js: - "0.10"
之后
node_js: - '0.10'
在其他一些情况下,引号会被完全删除。例如:
之前
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()
写回。
默认情况下ruamel.yaml“规范化”诸如缩进之类的东西并删除任何多余的引号。它也默认输出单引号,当这些是必要的时,因为单引号表示更简单的字符串(即只有单引号具有特殊含义,这些是 better/simpler 选项来区分可以解释为数字的字符串而不是双引号).
您可能错过的是您明确地告诉 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"
"""
yaml = ruamel.yaml.YAML()
yaml.preserve_quotes = Truej
data = ruamel.yaml.load(yaml_str_1)
ruamel.yaml.dump(data, sys.stdout)
print('=====')
data = ruamel.yaml.load(yaml_str_2)
ruamel.yaml.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()
)
yaml.preserve_quotes = True
适用于当前版本的 ruamel.yaml
。