keh*_*iya 8 python yaml ruamel.yaml
我ruamel.yaml用于修改 YAML 文件。我的要求是为现有键添加一个值,保留其他所有内容,包括订单。我让它工作了,但看起来其他键/值的引号在这个过程中也被修改了。
在某些情况下,双引号会转换为单引号。例如
前
node_js:
- "0.10"
Run Code Online (Sandbox Code Playgroud)
后
node_js:
- '0.10'
Run Code Online (Sandbox Code Playgroud)在其他一些情况下,引号会完全删除。例如:
前
before_script:
- "cp test/config-x.js src/config.js"
Run Code Online (Sandbox Code Playgroud)
后
before_script:
- cp test/config-x.js src/config.js
Run Code Online (Sandbox Code Playgroud)这两种情况都出现在同一个文件中。我怎样才能阻止这种情况发生并保留原始报价?
我load_yaml_guess_indent()用于加载和round_trip_dump()写回。
默认情况下,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"
"""
yaml = ruamel.yaml.YAML()
yaml.preserve_quotes = True
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)
Run Code Online (Sandbox Code Playgroud)
给出:
node_js:
- "0.10"
=====
before_script:
- "cp test/config-x.js src/config.js"
Run Code Online (Sandbox Code Playgroud)
使用该选项,所有字符串都将加载到字符串的特殊子类中,然后在加载时将其输出。如果替换此类加载的值,则需要使用这些类,因为仅分配新值不会保留该类型。添加:
data['before_script'][0] = type(data['before_script'][0])('ln -s xxx /usr/local/bin')
ruamel.yaml.round_trip_dump(data, sys.stdout)
Run Code Online (Sandbox Code Playgroud)
给出:
before_script:
- "ln -s xxx /usr/local/bin"
Run Code Online (Sandbox Code Playgroud)
(该类型恰好是ruamel.yaml.scalarstring.DoubleQuotedScalarString())
| 归档时间: |
|
| 查看次数: |
4879 次 |
| 最近记录: |