在 ruamel 中,如何像任何其他字符串一样以“*”开头且不带引号的字符串
In ruamel how to start a string with '*' with no quotes like any other string
yaml = ruamel.yaml.YAML()
yaml.indent(mapping=4)
test_yaml_file = open("test.yaml")
test_file = yaml.load(test_yaml_file)
# test = LiteralScalarString('*clvm')
test = "*testing"
test_file['test_perf'] = test
with open("test.yaml", 'w') as changed_file:
yaml.dump(test_file, changed_file)
在此预期输出是
test_perf: *testing
但输出已经
test_perf: '*testing'
如何使用 ruamel 实现此目的?
您的标量以 *
开头,它在 YAML 中用于指示 alias node。为了防止 *testing
在加载期间被解释为别名(即使文档中未指定相应的锚点(&testing
)),标量必须被引用或表示为文字或折叠块标量.
因此,除了选择将标量表示为文字或折叠块标量(您没有得到引号,但确实得到 |
resp. >
)
您不必担心这些引号,因为加载后您将再次拥有字符串 *testing
而不是突然有额外(不需要的)引号的东西。
在 YAML 中还有其他具有特殊含义的字符(&
、!
等),当在标量的开头指示时会导致标量被引用。转储例程实际做的是转储字符串并读回,如果这导致不同的值,转储器知道需要引用。这也适用于像 2022-01-28
这样的字符串,当回读时会产生一个日期,这样的字符串在转储时也会自动引用(对于看起来像浮点数、整数、true/false 值的字符串也是如此)。
yaml = ruamel.yaml.YAML()
yaml.indent(mapping=4)
test_yaml_file = open("test.yaml")
test_file = yaml.load(test_yaml_file)
# test = LiteralScalarString('*clvm')
test = "*testing"
test_file['test_perf'] = test
with open("test.yaml", 'w') as changed_file:
yaml.dump(test_file, changed_file)
在此预期输出是
test_perf: *testing
但输出已经
test_perf: '*testing'
如何使用 ruamel 实现此目的?
您的标量以 *
开头,它在 YAML 中用于指示 alias node。为了防止 *testing
在加载期间被解释为别名(即使文档中未指定相应的锚点(&testing
)),标量必须被引用或表示为文字或折叠块标量.
因此,除了选择将标量表示为文字或折叠块标量(您没有得到引号,但确实得到 |
resp. >
)
您不必担心这些引号,因为加载后您将再次拥有字符串 *testing
而不是突然有额外(不需要的)引号的东西。
在 YAML 中还有其他具有特殊含义的字符(&
、!
等),当在标量的开头指示时会导致标量被引用。转储例程实际做的是转储字符串并读回,如果这导致不同的值,转储器知道需要引用。这也适用于像 2022-01-28
这样的字符串,当回读时会产生一个日期,这样的字符串在转储时也会自动引用(对于看起来像浮点数、整数、true/false 值的字符串也是如此)。